Skip to content

Commit 481be5d

Browse files
authored
todo: parse listen_addrs to set transport in SwarmBuilder (#616)
1 parent 386f0a2 commit 481be5d

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

examples/ping/ping.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def send_ping(stream: INetStream) -> None:
5757
async def run(port: int, destination: str) -> None:
5858
localhost_ip = "127.0.0.1"
5959
listen_addr = multiaddr.Multiaddr(f"/ip4/0.0.0.0/tcp/{port}")
60-
host = new_host()
60+
host = new_host(listen_addrs=[listen_addr])
6161

6262
async with host.run(listen_addrs=[listen_addr]), trio.open_nursery() as nursery:
6363
if not destination:

libp2p/__init__.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from collections.abc import (
22
Mapping,
3+
Sequence,
34
)
45
from importlib.metadata import version as __version
56
from typing import (
@@ -9,6 +10,8 @@
910
cast,
1011
)
1112

13+
import multiaddr
14+
1215
from libp2p.abc import (
1316
IHost,
1417
IMuxedConn,
@@ -154,6 +157,7 @@ def new_swarm(
154157
sec_opt: Optional[TSecurityOptions] = None,
155158
peerstore_opt: Optional[IPeerStore] = None,
156159
muxer_preference: Optional[Literal["YAMUX", "MPLEX"]] = None,
160+
listen_addrs: Optional[Sequence[multiaddr.Multiaddr]] = None,
157161
) -> INetworkService:
158162
"""
159163
Create a swarm instance based on the parameters.
@@ -163,6 +167,7 @@ def new_swarm(
163167
:param sec_opt: optional choice of security upgrade
164168
:param peerstore_opt: optional peerstore
165169
:param muxer_preference: optional explicit muxer preference
170+
:param listen_addrs: optional list of multiaddrs to listen on
166171
:return: return a default swarm instance
167172
168173
Note: Yamux (/yamux/1.0.0) is the preferred stream multiplexer
@@ -175,8 +180,16 @@ def new_swarm(
175180

176181
id_opt = generate_peer_id_from(key_pair)
177182

178-
# TODO: Parse `listen_addrs` to determine transport
179-
transport = TCP()
183+
if listen_addrs is None:
184+
transport = TCP()
185+
else:
186+
addr = listen_addrs[0]
187+
if addr.__contains__("tcp"):
188+
transport = TCP()
189+
elif addr.__contains__("quic"):
190+
raise ValueError("QUIC not yet supported")
191+
else:
192+
raise ValueError(f"Unknown transport in listen_addrs: {listen_addrs}")
180193

181194
# Generate X25519 keypair for Noise
182195
noise_key_pair = create_new_x25519_key_pair()
@@ -229,6 +242,7 @@ def new_host(
229242
peerstore_opt: Optional[IPeerStore] = None,
230243
disc_opt: Optional[IPeerRouting] = None,
231244
muxer_preference: Optional[Literal["YAMUX", "MPLEX"]] = None,
245+
listen_addrs: Sequence[multiaddr.Multiaddr] = None,
232246
) -> IHost:
233247
"""
234248
Create a new libp2p host based on the given parameters.
@@ -239,6 +253,7 @@ def new_host(
239253
:param peerstore_opt: optional peerstore
240254
:param disc_opt: optional discovery
241255
:param muxer_preference: optional explicit muxer preference
256+
:param listen_addrs: optional list of multiaddrs to listen on
242257
:return: return a host instance
243258
"""
244259
swarm = new_swarm(
@@ -247,6 +262,7 @@ def new_host(
247262
sec_opt=sec_opt,
248263
peerstore_opt=peerstore_opt,
249264
muxer_preference=muxer_preference,
265+
listen_addrs=listen_addrs,
250266
)
251267

252268
if disc_opt is not None:

newsfragments/616.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow passing `listen_addrs` to `new_swarm` to customize swarm listening behavior.

tests/core/network/test_swarm.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,18 @@
77
wait_all_tasks_blocked,
88
)
99

10+
from libp2p import (
11+
new_swarm,
12+
)
1013
from libp2p.network.exceptions import (
1114
SwarmException,
1215
)
1316
from libp2p.tools.utils import (
1417
connect_swarm,
1518
)
19+
from libp2p.transport.tcp.tcp import (
20+
TCP,
21+
)
1622
from tests.utils.factories import (
1723
SwarmFactory,
1824
)
@@ -156,3 +162,20 @@ def clear():
156162

157163
swarms[0].peerstore.add_addrs(swarms[1].get_peer_id(), addrs + addrs, 10000)
158164
await swarms[0].dial_peer(swarms[1].get_peer_id())
165+
166+
167+
def test_new_swarm_defaults_to_tcp():
168+
swarm = new_swarm()
169+
assert isinstance(swarm.transport, TCP)
170+
171+
172+
def test_new_swarm_tcp_multiaddr_supported():
173+
addr = Multiaddr("/ip4/127.0.0.1/tcp/9999")
174+
swarm = new_swarm(listen_addrs=[addr])
175+
assert isinstance(swarm.transport, TCP)
176+
177+
178+
def test_new_swarm_quic_multiaddr_raises():
179+
addr = Multiaddr("/ip4/127.0.0.1/udp/9999/quic")
180+
with pytest.raises(ValueError, match="QUIC not yet supported"):
181+
new_swarm(listen_addrs=[addr])

0 commit comments

Comments
 (0)