Skip to content

Commit 6b742bc

Browse files
committed
refactor(p2p): implement P2PDependencies class
1 parent 3c767f7 commit 6b742bc

25 files changed

+395
-261
lines changed

hathor/builder/builder.py

+16-18
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from hathor.manager import HathorManager
3636
from hathor.mining.cpu_mining_service import CpuMiningService
3737
from hathor.p2p.manager import ConnectionsManager
38+
from hathor.p2p.p2p_dependencies import P2PDependencies
3839
from hathor.p2p.peer import PrivatePeer
3940
from hathor.pubsub import PubSubManager
4041
from hathor.reactor import ReactorProtocol as Reactor
@@ -64,12 +65,10 @@ class SyncSupportLevel(IntEnum):
6465
@classmethod
6566
def add_factories(
6667
cls,
67-
settings: HathorSettingsType,
6868
p2p_manager: ConnectionsManager,
69+
dependencies: P2PDependencies,
6970
sync_v1_support: 'SyncSupportLevel',
7071
sync_v2_support: 'SyncSupportLevel',
71-
vertex_parser: VertexParser,
72-
vertex_handler: VertexHandler,
7372
) -> None:
7473
"""Adds the sync factory to the manager according to the support level."""
7574
from hathor.p2p.sync_v1.factory import SyncV11Factory
@@ -78,18 +77,12 @@ def add_factories(
7877

7978
# sync-v1 support:
8079
if sync_v1_support > cls.UNAVAILABLE:
81-
p2p_manager.add_sync_factory(SyncVersion.V1_1, SyncV11Factory(p2p_manager, vertex_parser=vertex_parser))
80+
p2p_manager.add_sync_factory(SyncVersion.V1_1, SyncV11Factory(dependencies))
8281
if sync_v1_support is cls.ENABLED:
8382
p2p_manager.enable_sync_version(SyncVersion.V1_1)
8483
# sync-v2 support:
8584
if sync_v2_support > cls.UNAVAILABLE:
86-
sync_v2_factory = SyncV2Factory(
87-
settings,
88-
p2p_manager,
89-
vertex_parser=vertex_parser,
90-
vertex_handler=vertex_handler,
91-
)
92-
p2p_manager.add_sync_factory(SyncVersion.V2, sync_v2_factory)
85+
p2p_manager.add_sync_factory(SyncVersion.V2, SyncV2Factory(dependencies))
9386
if sync_v2_support is cls.ENABLED:
9487
p2p_manager.enable_sync_version(SyncVersion.V2)
9588

@@ -415,25 +408,30 @@ def _get_or_create_p2p_manager(self) -> ConnectionsManager:
415408
return self._p2p_manager
416409

417410
enable_ssl = True
418-
reactor = self._get_reactor()
419411
my_peer = self._get_peer()
420412

421-
self._p2p_manager = ConnectionsManager(
413+
dependencies = P2PDependencies(
414+
reactor=self._get_reactor(),
422415
settings=self._get_or_create_settings(),
423-
reactor=reactor,
424-
my_peer=my_peer,
416+
vertex_parser=self._get_or_create_vertex_parser(),
417+
tx_storage=self._get_or_create_tx_storage(),
418+
vertex_handler=self._get_or_create_vertex_handler(),
419+
verification_service=self._get_or_create_verification_service(),
425420
pubsub=self._get_or_create_pubsub(),
421+
)
422+
423+
self._p2p_manager = ConnectionsManager(
424+
dependencies=dependencies,
425+
my_peer=my_peer,
426426
ssl=enable_ssl,
427427
whitelist_only=False,
428428
rng=self._rng,
429429
)
430430
SyncSupportLevel.add_factories(
431-
self._get_or_create_settings(),
432431
self._p2p_manager,
432+
dependencies,
433433
self._sync_v1_support,
434434
self._sync_v2_support,
435-
self._get_or_create_vertex_parser(),
436-
self._get_or_create_vertex_handler(),
437435
)
438436
return self._p2p_manager
439437

hathor/builder/cli_builder.py

+20-13
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from hathor.mining.cpu_mining_service import CpuMiningService
3737
from hathor.p2p.entrypoint import Entrypoint
3838
from hathor.p2p.manager import ConnectionsManager
39+
from hathor.p2p.p2p_dependencies import P2PDependencies
3940
from hathor.p2p.peer import PrivatePeer
4041
from hathor.p2p.utils import discover_hostname, get_genesis_short_hash
4142
from hathor.pubsub import PubSubManager
@@ -318,16 +319,6 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
318319

319320
cpu_mining_service = CpuMiningService()
320321

321-
p2p_manager = ConnectionsManager(
322-
settings=settings,
323-
reactor=reactor,
324-
my_peer=peer,
325-
pubsub=pubsub,
326-
ssl=True,
327-
whitelist_only=False,
328-
rng=Random(),
329-
)
330-
331322
vertex_handler = VertexHandler(
332323
reactor=reactor,
333324
settings=settings,
@@ -340,13 +331,29 @@ def create_manager(self, reactor: Reactor) -> HathorManager:
340331
log_vertex_bytes=self._args.log_vertex_bytes,
341332
)
342333

334+
p2p_dependencies = P2PDependencies(
335+
reactor=reactor,
336+
settings=settings,
337+
vertex_parser=vertex_parser,
338+
tx_storage=tx_storage,
339+
vertex_handler=vertex_handler,
340+
verification_service=verification_service,
341+
pubsub=pubsub,
342+
)
343+
344+
p2p_manager = ConnectionsManager(
345+
dependencies=p2p_dependencies,
346+
my_peer=peer,
347+
ssl=True,
348+
whitelist_only=False,
349+
rng=Random(),
350+
)
351+
343352
SyncSupportLevel.add_factories(
344-
settings,
345353
p2p_manager,
354+
p2p_dependencies,
346355
sync_v1_support,
347356
sync_v2_support,
348-
vertex_parser,
349-
vertex_handler,
350357
)
351358

352359
from hathor.consensus.poa import PoaBlockProducer, PoaSignerFile

hathor/p2p/factory.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
from twisted.internet import protocol
1818
from twisted.internet.interfaces import IAddress
1919

20-
from hathor.conf.settings import HathorSettings
2120
from hathor.p2p.manager import ConnectionsManager
21+
from hathor.p2p.p2p_dependencies import P2PDependencies
2222
from hathor.p2p.peer import PrivatePeer
2323
from hathor.p2p.protocol import HathorLineReceiver
2424

@@ -31,22 +31,22 @@ def __init__(
3131
my_peer: PrivatePeer,
3232
p2p_manager: ConnectionsManager,
3333
*,
34-
settings: HathorSettings,
34+
dependencies: P2PDependencies,
3535
use_ssl: bool,
3636
):
3737
super().__init__()
38-
self._settings = settings
3938
self.my_peer = my_peer
4039
self.p2p_manager = p2p_manager
40+
self.dependencies = dependencies
4141
self.use_ssl = use_ssl
4242

4343
def buildProtocol(self, addr: IAddress) -> HathorLineReceiver:
4444
p = HathorLineReceiver(
4545
my_peer=self.my_peer,
4646
p2p_manager=self.p2p_manager,
47+
dependencies=self.dependencies,
4748
use_ssl=self.use_ssl,
4849
inbound=self.inbound,
49-
settings=self._settings
5050
)
5151
p.factory = self
5252
return p

hathor/p2p/manager.py

+22-21
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
from twisted.python.failure import Failure
2525
from twisted.web.client import Agent
2626

27-
from hathor.conf.settings import HathorSettings
2827
from hathor.p2p.entrypoint import Entrypoint
2928
from hathor.p2p.netfilter.factory import NetfilterFactory
29+
from hathor.p2p.p2p_dependencies import P2PDependencies
3030
from hathor.p2p.peer import PrivatePeer, PublicPeer, UnverifiedPeer
3131
from hathor.p2p.peer_discovery import PeerDiscovery
3232
from hathor.p2p.peer_id import PeerId
@@ -37,8 +37,7 @@
3737
from hathor.p2p.sync_factory import SyncAgentFactory
3838
from hathor.p2p.sync_version import SyncVersion
3939
from hathor.p2p.utils import parse_whitelist
40-
from hathor.pubsub import HathorEvents, PubSubManager
41-
from hathor.reactor import ReactorProtocol as Reactor
40+
from hathor.pubsub import HathorEvents
4241
from hathor.transaction import BaseTransaction
4342
from hathor.util import Random
4443

@@ -93,24 +92,23 @@ class GlobalRateLimiter:
9392

9493
def __init__(
9594
self,
96-
settings: HathorSettings,
97-
reactor: Reactor,
95+
dependencies: P2PDependencies,
9896
my_peer: PrivatePeer,
99-
pubsub: PubSubManager,
10097
ssl: bool,
10198
rng: Random,
10299
whitelist_only: bool,
103100
) -> None:
104101
self.log = logger.new()
105-
self._settings = settings
102+
self.dependencies = dependencies
103+
self._settings = dependencies.settings
106104
self.rng = rng
107105
self.manager = None
108106

109-
self.MAX_ENABLED_SYNC = settings.MAX_ENABLED_SYNC
110-
self.SYNC_UPDATE_INTERVAL = settings.SYNC_UPDATE_INTERVAL
111-
self.PEER_DISCOVERY_INTERVAL = settings.PEER_DISCOVERY_INTERVAL
107+
self.MAX_ENABLED_SYNC = self._settings.MAX_ENABLED_SYNC
108+
self.SYNC_UPDATE_INTERVAL = self._settings.SYNC_UPDATE_INTERVAL
109+
self.PEER_DISCOVERY_INTERVAL = self._settings.PEER_DISCOVERY_INTERVAL
112110

113-
self.reactor = reactor
111+
self.reactor = dependencies.reactor
114112
self.my_peer = my_peer
115113

116114
# List of address descriptions to listen for new connections (eg: [tcp:8000])
@@ -129,10 +127,16 @@ def __init__(
129127
from hathor.p2p.factory import HathorClientFactory, HathorServerFactory
130128
self.use_ssl = ssl
131129
self.server_factory = HathorServerFactory(
132-
self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
130+
my_peer=self.my_peer,
131+
p2p_manager=self,
132+
dependencies=dependencies,
133+
use_ssl=self.use_ssl,
133134
)
134135
self.client_factory = HathorClientFactory(
135-
self.my_peer, p2p_manager=self, use_ssl=self.use_ssl, settings=self._settings
136+
my_peer=self.my_peer,
137+
p2p_manager=self,
138+
dependencies=dependencies,
139+
use_ssl=self.use_ssl,
136140
)
137141

138142
# Global maximum number of connections.
@@ -184,9 +188,6 @@ def __init__(
184188
self.wl_reconnect = LoopingCall(self.update_whitelist)
185189
self.wl_reconnect.clock = self.reactor
186190

187-
# Pubsub object to publish events
188-
self.pubsub = pubsub
189-
190191
# Parameter to explicitly enable whitelist-only mode, when False it will still check the whitelist for sync-v1
191192
self.whitelist_only = whitelist_only
192193

@@ -373,7 +374,7 @@ def on_connection_failure(self, failure: Failure, peer: Optional[UnverifiedPeer
373374
self.log.warn('connection failure', entrypoint=entrypoint, failure=failure.getErrorMessage())
374375
self.connecting_peers.pop(endpoint)
375376

376-
self.pubsub.publish(
377+
self.dependencies.publish(
377378
HathorEvents.NETWORK_PEER_CONNECTION_FAILED,
378379
peer=peer,
379380
peers_count=self._get_peers_count()
@@ -388,7 +389,7 @@ def on_peer_connect(self, protocol: HathorProtocol) -> None:
388389
self.connections.add(protocol)
389390
self.handshaking_peers.add(protocol)
390391

391-
self.pubsub.publish(
392+
self.dependencies.publish(
392393
HathorEvents.NETWORK_PEER_CONNECTED,
393394
protocol=protocol,
394395
peers_count=self._get_peers_count()
@@ -405,7 +406,7 @@ def on_peer_ready(self, protocol: HathorProtocol) -> None:
405406

406407
# we emit the event even if it's a duplicate peer as a matching
407408
# NETWORK_PEER_DISCONNECTED will be emitted regardless
408-
self.pubsub.publish(
409+
self.dependencies.publish(
409410
HathorEvents.NETWORK_PEER_READY,
410411
protocol=protocol,
411412
peers_count=self._get_peers_count()
@@ -459,7 +460,7 @@ def on_peer_disconnect(self, protocol: HathorProtocol) -> None:
459460
# chance it can happen if both connections start at the same time and none of them has
460461
# reached READY state while the other is on PEER_ID state
461462
self.connected_peers[protocol.peer.id] = existing_protocol
462-
self.pubsub.publish(
463+
self.dependencies.publish(
463464
HathorEvents.NETWORK_PEER_DISCONNECTED,
464465
protocol=protocol,
465466
peers_count=self._get_peers_count()
@@ -653,7 +654,7 @@ def connect_to(
653654
deferred.addCallback(self._connect_to_callback, peer, endpoint, entrypoint) # type: ignore
654655
deferred.addErrback(self.on_connection_failure, peer, endpoint) # type: ignore
655656
self.log.info('connect to', entrypoint=str(entrypoint), peer=str(peer))
656-
self.pubsub.publish(
657+
self.dependencies.publish(
657658
HathorEvents.NETWORK_PEER_CONNECTING,
658659
peer=peer,
659660
peers_count=self._get_peers_count()

0 commit comments

Comments
 (0)