libp2p 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {libp2p-0.3.0/libp2p.egg-info → libp2p-0.4.0}/PKG-INFO +8 -5
- {libp2p-0.3.0 → libp2p-0.4.0}/README.md +3 -3
- {libp2p-0.3.0 → libp2p-0.4.0}/docs/conf.py +23 -2
- libp2p-0.4.0/examples/bitswap/__init__.py +1 -0
- libp2p-0.4.0/examples/bitswap/bitswap.py +393 -0
- libp2p-0.4.0/examples/circuit_relay/__init__.py +5 -0
- libp2p-0.4.0/examples/circuit_relay/relay_example.py +611 -0
- libp2p-0.4.0/examples/doc-examples/example_mplex_timeouts.py +392 -0
- libp2p-0.4.0/examples/monitoring-demo/configure.py +31 -0
- libp2p-0.4.0/examples/monitoring-demo/run_demo.py +300 -0
- libp2p-0.4.0/examples/rendezvous/rendezvous.py +295 -0
- libp2p-0.4.0/examples/upnp/upnp_demo.py +45 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/test_websocket_transport.py +5 -2
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/__init__.py +52 -7
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/abc.py +107 -0
- libp2p-0.4.0/libp2p/bitswap/__init__.py +64 -0
- libp2p-0.4.0/libp2p/bitswap/block_store.py +109 -0
- libp2p-0.4.0/libp2p/bitswap/chunker.py +180 -0
- libp2p-0.4.0/libp2p/bitswap/cid.py +236 -0
- libp2p-0.4.0/libp2p/bitswap/client.py +860 -0
- libp2p-0.4.0/libp2p/bitswap/config.py +39 -0
- libp2p-0.4.0/libp2p/bitswap/dag.py +589 -0
- libp2p-0.4.0/libp2p/bitswap/dag_pb.py +268 -0
- libp2p-0.4.0/libp2p/bitswap/errors.py +51 -0
- libp2p-0.4.0/libp2p/bitswap/messages.py +166 -0
- libp2p-0.4.0/libp2p/bitswap/pb/__init__.py +1 -0
- libp2p-0.4.0/libp2p/bitswap/pb/bitswap_pb2.py +38 -0
- libp2p-0.4.0/libp2p/bitswap/pb/bitswap_pb2.pyi +185 -0
- libp2p-0.4.0/libp2p/bitswap/pb/dag_pb_pb2.py +28 -0
- libp2p-0.4.0/libp2p/bitswap/pb/dag_pb_pb2.pyi +65 -0
- libp2p-0.4.0/libp2p/bitswap/pb/unixfs_pb2.py +32 -0
- libp2p-0.4.0/libp2p/bitswap/pb/unixfs_pb2.pyi +126 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/__init__.py +37 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/client.py +362 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/config.py +34 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/discovery.py +259 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/errors.py +87 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/messages.py +84 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/pb/__init__.py +7 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/pb/rendezvous_pb2.py +48 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/pb/rendezvous_pb2.pyi +292 -0
- libp2p-0.4.0/libp2p/discovery/rendezvous/service.py +332 -0
- libp2p-0.4.0/libp2p/discovery/upnp/upnp.py +196 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/basic_host.py +96 -10
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/routed_host.py +29 -1
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/identify.py +15 -22
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/trio.py +11 -6
- libp2p-0.4.0/libp2p/kad_dht/common.py +21 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/kad_dht.py +132 -9
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/provider_store.py +4 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/routing_table.py +4 -6
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/value_store.py +10 -8
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/swarm_connection.py +72 -2
- libp2p-0.4.0/libp2p/network/stream/net_stream.py +367 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/swarm.py +256 -36
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/id.py +5 -3
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peer_record.py +1 -1
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect_client.py +3 -3
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/gossipsub.py +329 -26
- libp2p-0.4.0/libp2p/pubsub/pb/rpc_pb2.py +52 -0
- libp2p-0.4.0/libp2p/pubsub/pb/rpc_pb2.pyi +346 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/pubsub.py +47 -3
- libp2p-0.4.0/libp2p/pubsub/score.py +299 -0
- libp2p-0.4.0/libp2p/rcmgr/__init__.py +21 -0
- libp2p-0.4.0/libp2p/rcmgr/allowlist.py +162 -0
- libp2p-0.4.0/libp2p/rcmgr/cidr_limits.py +90 -0
- libp2p-0.4.0/libp2p/rcmgr/circuit_breaker.py +147 -0
- libp2p-0.4.0/libp2p/rcmgr/config.py +598 -0
- libp2p-0.4.0/libp2p/rcmgr/connection_lifecycle.py +334 -0
- libp2p-0.4.0/libp2p/rcmgr/connection_limits.py +248 -0
- libp2p-0.4.0/libp2p/rcmgr/connection_pool.py +147 -0
- libp2p-0.4.0/libp2p/rcmgr/connection_tracker.py +470 -0
- libp2p-0.4.0/libp2p/rcmgr/enhanced_errors.py +579 -0
- libp2p-0.4.0/libp2p/rcmgr/exceptions.py +111 -0
- libp2p-0.4.0/libp2p/rcmgr/graceful_degradation.py +258 -0
- libp2p-0.4.0/libp2p/rcmgr/health_checks.py +652 -0
- libp2p-0.4.0/libp2p/rcmgr/limits.py +8 -0
- libp2p-0.4.0/libp2p/rcmgr/manager.py +798 -0
- libp2p-0.4.0/libp2p/rcmgr/memory_limits.py +356 -0
- libp2p-0.4.0/libp2p/rcmgr/memory_pool.py +128 -0
- libp2p-0.4.0/libp2p/rcmgr/memory_stats.py +340 -0
- libp2p-0.4.0/libp2p/rcmgr/metrics.py +287 -0
- libp2p-0.4.0/libp2p/rcmgr/monitoring.py +723 -0
- libp2p-0.4.0/libp2p/rcmgr/prometheus_exporter.py +463 -0
- libp2p-0.4.0/libp2p/rcmgr/protocol_rate_limiter.py +649 -0
- libp2p-0.4.0/libp2p/rcmgr/rate_limiter.py +714 -0
- libp2p-0.4.0/libp2p/rcmgr/token_bucket.py +469 -0
- libp2p-0.4.0/libp2p/records/pubkey.py +102 -0
- libp2p-0.4.0/libp2p/records/record.py +19 -0
- libp2p-0.4.0/libp2p/records/utils.py +27 -0
- libp2p-0.4.0/libp2p/records/validator.py +89 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/dcutr.py +4 -3
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/discovery.py +20 -2
- libp2p-0.4.0/libp2p/relay/circuit_v2/pb/circuit_pb2.py +40 -0
- libp2p-0.4.0/libp2p/relay/circuit_v2/pb/circuit_pb2.pyi +92 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/protocol.py +303 -243
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/protocol_buffer.py +4 -7
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/transport.py +149 -93
- libp2p-0.4.0/libp2p/relay/circuit_v2/utils.py +86 -0
- libp2p-0.4.0/libp2p/security/__init__.py +24 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/exceptions.py +4 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secure_session.py +5 -0
- libp2p-0.4.0/libp2p/security/tls/__init__.py +36 -0
- libp2p-0.4.0/libp2p/security/tls/certificate.py +392 -0
- libp2p-0.4.0/libp2p/security/tls/io.py +299 -0
- libp2p-0.4.0/libp2p/security/tls/transport.py +372 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/mplex_stream.py +130 -23
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/constants.py +29 -1
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/connection.py +66 -20
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/listener.py +2 -2
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/stream.py +8 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/transport.py +4 -2
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/utils.py +6 -10
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/tcp/tcp.py +6 -0
- {libp2p-0.3.0 → libp2p-0.4.0/libp2p.egg-info}/PKG-INFO +8 -5
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/SOURCES.txt +143 -14
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/entry_points.txt +1 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/requires.txt +2 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/top_level.txt +1 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/pyproject.toml +8 -4
- {libp2p-0.3.0 → libp2p-0.4.0}/scripts/release/test_package.py +10 -2
- libp2p-0.4.0/tests/core/bitswap/__init__.py +1 -0
- libp2p-0.4.0/tests/core/bitswap/conftest.py +40 -0
- libp2p-0.4.0/tests/core/bitswap/test_block_store.py +146 -0
- libp2p-0.4.0/tests/core/bitswap/test_chunker.py +378 -0
- libp2p-0.4.0/tests/core/bitswap/test_cid.py +122 -0
- libp2p-0.4.0/tests/core/bitswap/test_client.py +303 -0
- libp2p-0.4.0/tests/core/bitswap/test_dag.py +567 -0
- libp2p-0.4.0/tests/core/bitswap/test_dag_pb.py +319 -0
- libp2p-0.4.0/tests/core/bitswap/test_integration.py +438 -0
- libp2p-0.4.0/tests/core/bitswap/test_messages.py +175 -0
- libp2p-0.4.0/tests/core/bitswap/test_protocol_versions.py +534 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/__init__.py +1 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_client.py +260 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_config.py +123 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_discovery.py +290 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_errors.py +250 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_integration.py +394 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_messages.py +359 -0
- libp2p-0.4.0/tests/core/discovery/rendezvous/test_service.py +390 -0
- libp2p-0.4.0/tests/core/discovery/upnp/test_upnp.py +209 -0
- libp2p-0.4.0/tests/core/io/test_trio_error_handling.py +136 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_kad_dht.py +125 -26
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_value_store.py +47 -21
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_net_stream.py +4 -4
- libp2p-0.4.0/tests/core/network/test_net_stream_concurrency.py +423 -0
- libp2p-0.4.0/tests/core/network/test_net_stream_error_state.py +223 -0
- libp2p-0.4.0/tests/core/network/test_net_stream_state_transitions.py +113 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_dummyaccount_demo.py +3 -3
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_get_message_id.py +119 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_px_and_backoff.py +12 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v12.py +281 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v12_integration.py +185 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_core_functionality.py +173 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_flood_publishing.py +333 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_ihave_iwant.py +270 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_invalid_behavior.py +301 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_network_scenarios.py +301 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_opportunistic_grafting.py +371 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_peer_scoring.py +867 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_peer_scoring_behavior.py +231 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_score_gates.py +661 -0
- libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_signed_peer_records.py +509 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_pubsub.py +36 -0
- libp2p-0.4.0/tests/core/rcmgr/__init__.py +6 -0
- libp2p-0.4.0/tests/core/rcmgr/test_cidr_limits.py +24 -0
- libp2p-0.4.0/tests/core/rcmgr/test_connection_protection.py +144 -0
- libp2p-0.4.0/tests/core/rcmgr/test_enum_string_conversion.py +57 -0
- libp2p-0.4.0/tests/core/rcmgr/test_hierarchical_scopes.py +48 -0
- libp2p-0.4.0/tests/core/rcmgr/test_preupgrade_admission.py +20 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rate_limiting.py +46 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_config.py +447 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_core.py +326 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_health_checks.py +350 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_integration.py +61 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_metrics.py +317 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_monitoring.py +414 -0
- libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_simple.py +143 -0
- libp2p-0.4.0/tests/core/rcmgr/test_resource_manager_integration.py +74 -0
- libp2p-0.4.0/tests/core/records/test_validator.py +145 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_discovery.py +1 -1
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_protocol.py +302 -4
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_transport.py +133 -3
- libp2p-0.4.0/tests/core/security/tls/test_certificate.py +44 -0
- libp2p-0.4.0/tests/core/security/tls/test_tls.py +62 -0
- libp2p-0.4.0/tests/core/security/tls/test_transport_security.py +179 -0
- libp2p-0.4.0/tests/core/stream_muxer/test_mplex_stream.py +559 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_based_service.py +2 -0
- libp2p-0.4.0/tests/core/tools/test_bind_address_config.py +162 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_websocket.py +10 -9
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/factories.py +57 -0
- libp2p-0.4.0/tests/utils/pubsub/__init__.py +0 -0
- libp2p-0.3.0/examples/doc-examples/example_net_stream.py +0 -271
- libp2p-0.3.0/libp2p/kad_dht/common.py +0 -14
- libp2p-0.3.0/libp2p/network/stream/net_stream.py +0 -314
- libp2p-0.3.0/libp2p/pubsub/pb/rpc_pb2.py +0 -52
- libp2p-0.3.0/libp2p/pubsub/pb/rpc_pb2.pyi +0 -132
- libp2p-0.3.0/libp2p/relay/circuit_v2/pb/circuit_pb2.py +0 -39
- libp2p-0.3.0/libp2p/relay/circuit_v2/pb/circuit_pb2.pyi +0 -184
- libp2p-0.3.0/tests/core/stream_muxer/test_mplex_stream.py +0 -252
- {libp2p-0.3.0 → libp2p-0.4.0}/LICENSE-APACHE +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/LICENSE-MIT +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/MANIFEST.in +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/advanced/network_discover.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/bootstrap/bootstrap.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/chat/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/chat/chat.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_insecure.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_noise.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_secio.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_multiplexer.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_peer_discovery.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_quic_transport.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_running.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_transport.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/multiple_connections_example.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/echo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/echo_quic.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify/identify.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/identify_push_demo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/identify_push_listener_dialer.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/kademlia/kademlia.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/mDNS/mDNS.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/ping/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/ping/ping.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/pubsub/pubsub.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/random_walk/random_walk.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/test_tcp_data_transfer.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/transport_integration_demo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/test_tcp_echo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/websocket_demo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/authenticated_encryption.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/ecc.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/ed25519.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/key_exchange.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/keys.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/crypto_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/crypto_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/rsa.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/secp256k1.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/serialization.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/x25519.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/custom_types.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/bootstrap.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/events/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/events/peerDiscovery.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/broadcaster.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/listener.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/mdns.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/config.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/random_walk.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/rt_refresh_manager.py +0 -0
- {libp2p-0.3.0/libp2p/host → libp2p-0.4.0/libp2p/discovery/upnp}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/host/autonat/pb → libp2p-0.4.0/libp2p/host}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/autonat.py +0 -0
- {libp2p-0.3.0/libp2p/identity/identify → libp2p-0.4.0/libp2p/host/autonat}/pb/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2_grpc.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2_grpc.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/generate_proto.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/defaults.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/ping.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/__init__.py +0 -0
- {libp2p-0.3.0/libp2p/io → libp2p-0.4.0/libp2p/identity/identify/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/pb/identify_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/pb/identify_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify_push/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify_push/identify_push.py +0 -0
- {libp2p-0.3.0/libp2p/kad_dht/pb → libp2p-0.4.0/libp2p/io}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/abc.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/msgio.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/__init__.py +0 -0
- {libp2p-0.3.0/libp2p/network → libp2p-0.4.0/libp2p/kad_dht/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/pb/kademlia_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/pb/kademlia_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/peer_routing.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/utils.py +0 -0
- {libp2p-0.3.0/libp2p/network/connection → libp2p-0.4.0/libp2p/network}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/config.py +0 -0
- {libp2p-0.3.0/libp2p/network/stream → libp2p-0.4.0/libp2p/network/connection}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/raw_connection.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/peer → libp2p-0.4.0/libp2p/network/stream}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/stream/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/protocol_muxer → libp2p-0.4.0/libp2p/peer}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/envelope.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/crypto_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/crypto_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/envelope_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/envelope_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/peer_record_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/peer_record_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerdata.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerinfo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerstore.py +0 -0
- {libp2p-0.3.0/libp2p/pubsub → libp2p-0.4.0/libp2p/protocol_muxer}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect_communicator.py +0 -0
- {libp2p-0.3.0/libp2p/pubsub/pb → libp2p-0.4.0/libp2p/pubsub}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/floodsub.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/mcache.py +0 -0
- {libp2p-0.3.0/libp2p/security → libp2p-0.4.0/libp2p/pubsub/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/pubsub_notifee.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/subscription.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/validators.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/py.typed +0 -0
- {libp2p-0.3.0/libp2p/security/insecure → libp2p-0.4.0/libp2p/records}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/config.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/nat.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/dcutr_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/dcutr_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/resources.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/base_session.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/base_transport.py +0 -0
- {libp2p-0.3.0/libp2p/security/insecure/pb → libp2p-0.4.0/libp2p/security/insecure}/__init__.py +0 -0
- {libp2p-0.3.0/libp2p/security/noise → libp2p-0.4.0/libp2p/security/insecure/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/pb/plaintext_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/pb/plaintext_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/transport.py +0 -0
- {libp2p-0.3.0/libp2p/security/noise/pb → libp2p-0.4.0/libp2p/security/noise}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/io.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/messages.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/patterns.py +0 -0
- {libp2p-0.3.0/libp2p/security/secio → libp2p-0.4.0/libp2p/security/noise/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/pb/noise_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/pb/noise_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/transport.py +0 -0
- {libp2p-0.3.0/libp2p/security/secio/pb → libp2p-0.4.0/libp2p/security/secio}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/stream_muxer → libp2p-0.4.0/libp2p/security/secio/pb}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/pb/spipe_pb2.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/pb/spipe_pb2.pyi +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/transport.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/security_multistream.py +0 -0
- {libp2p-0.3.0/libp2p/stream_muxer/mplex → libp2p-0.4.0/libp2p/stream_muxer}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/tools → libp2p-0.4.0/libp2p/stream_muxer/mplex}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/constants.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/datastructures.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/mplex.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/muxer_multistream.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/rw_lock.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/yamux/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/yamux/yamux.py +0 -0
- {libp2p-0.3.0/libp2p/tools/timed_cache → libp2p-0.4.0/libp2p/tools}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/_utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/abc.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/base.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/stats.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/trio_service.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/typing.py +0 -0
- {libp2p-0.3.0/libp2p/transport/quic → libp2p-0.4.0/libp2p/tools/timed_cache}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/base_timed_cache.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/first_seen_cache.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/last_seen_cache.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/exceptions.py +0 -0
- {libp2p-0.3.0/libp2p/transport/tcp → libp2p-0.4.0/libp2p/transport/quic}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/config.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/security.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/libp2p/transport/tcp}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/transport_registry.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/upgrader.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/connection.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/listener.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/multiaddr_utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/transport.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/address_validation.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/logging.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/paths.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/varint.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/version.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/dependency_links.txt +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/newsfragments/validate_files.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/scripts/audit_paths.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/setup.cfg +0 -0
- {libp2p-0.3.0/tests/discovery/mdns → libp2p-0.4.0/tests}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/conftest.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_ed25519.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_rsa.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_secp256k1.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_x25519.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/__init__.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/__init__.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/test_integration.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/test_utils.py +0 -0
- {libp2p-0.3.0/tests/interop → libp2p-0.4.0/tests/core/discovery/mdns}/__init__.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_broadcaster.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_listener.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_mdns.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_utils.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/random_walk/test_random_walk.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/random_walk/test_rt_refresh_manager.py +0 -0
- {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/exceptions/test_exceptions.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_autonat.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_basic_host.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_connected_peers.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_live_peers.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_ping.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_routed_host.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify/test_identify.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify/test_identify_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify_push/test_identify_push.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify_push/test_identify_push_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_peer_routing.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_provider_store.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_routing_table.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/conftest.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_enhanced_swarm.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notifee_performance.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notify.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notify_listen_lifecycle.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_swarm.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_swarm_conn.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_addrbook.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_envelope.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_interop.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peer_record.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerdata.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerid.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerinfo.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peermetadata.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerstore.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/protocol_muxer/test_negotiate_timeout.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/protocol_muxer/test_protocol_muxer.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_floodsub.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_backward_compatibility.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_direct_peers.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_mcache.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_pubsub_notifee_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_subscription.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_dcutr_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_dcutr_protocol.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_nat.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/noise/test_msg_read_writer.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/noise/test_noise.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_insecure_peerstore_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_secio.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_security_multistream.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/conftest.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_async_context_manager.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_mplex_conn.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_multiplexer_selection.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_muxer_multistream.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_read_write_lock.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux_interleaving.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux_interleaving_EOF.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/test_import_and_version.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/test_libp2p/test_libp2p.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_external_api.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_manager_stats.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/timed_cache/test_timed_cache.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_concurrency.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_connection.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_connection_id.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_integration.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_listener.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_transport.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_tcp.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_transport_registry.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_upgrader.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_websocket_p2p.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/utils/test_varint.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_echo_thin_waist.py +0 -0
- {libp2p-0.3.0/tests/core → libp2p-0.4.0/tests}/examples/test_examples.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_examples_bind_address.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_quic_echo_example.py +0 -0
- {libp2p-0.3.0/tests/utils → libp2p-0.4.0/tests/interop}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/go_libp2p/test_go_basic.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/README.md +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/README.md +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/package.json +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/package.json +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping.js +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping_client.js +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping_server.js +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ws_ping_node.mjs +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/scripts/run_test.ps1 +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/scripts/run_test.sh +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/.gitignore +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/conftest.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/nim_echo_server.nim +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/scripts/setup_nim_echo.sh +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/test_echo_interop.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/rust_libp2p/test_rust_basic.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/test_js_ws_ping.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/zig_libp2p/test_zig_basic.py +0 -0
- {libp2p-0.3.0/tests/utils/interop → libp2p-0.4.0/tests/utils}/__init__.py +0 -0
- {libp2p-0.3.0/tests/utils/pubsub → libp2p-0.4.0/tests/utils/interop}/__init__.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/constants.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/daemon.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/envs.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/process.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/dummy_account_node.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/floodsub_integration_test_settings.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/utils.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_address_validation.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_default_bind_address.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_logging.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_paths.py +0 -0
- {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/utils.py +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: libp2p
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: libp2p: The Python implementation of the libp2p networking stack
|
|
5
|
+
Maintainer: Luca (acul71)
|
|
5
6
|
Maintainer-email: pacrob <pacrob-py-libp2p@proton.me>, Manu Sheel Gupta <manu@seeta.in>, Dave Grantham <dwg@linuxprogrammer.org>
|
|
6
|
-
License: MIT AND Apache-2.0
|
|
7
|
+
License-Expression: MIT AND Apache-2.0
|
|
7
8
|
Project-URL: Homepage, https://github.com/libp2p/py-libp2p
|
|
8
9
|
Keywords: libp2p,p2p
|
|
9
10
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -25,6 +26,7 @@ Requires-Dist: exceptiongroup>=1.2.0; python_version < "3.11"
|
|
|
25
26
|
Requires-Dist: fastecdsa==2.3.2; sys_platform != "win32"
|
|
26
27
|
Requires-Dist: grpcio>=1.41.0
|
|
27
28
|
Requires-Dist: lru-dict>=1.1.6
|
|
29
|
+
Requires-Dist: miniupnpc>=2.3
|
|
28
30
|
Requires-Dist: multiaddr>=0.0.11
|
|
29
31
|
Requires-Dist: mypy-protobuf>=3.0.0
|
|
30
32
|
Requires-Dist: noiseprotocol>=0.3.0
|
|
@@ -68,6 +70,7 @@ Provides-Extra: test
|
|
|
68
70
|
Requires-Dist: factory-boy<3.0.0,>=2.12.0; extra == "test"
|
|
69
71
|
Requires-Dist: p2pclient==0.2.0; extra == "test"
|
|
70
72
|
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
73
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
|
71
74
|
Requires-Dist: pytest-timeout>=2.4.0; extra == "test"
|
|
72
75
|
Requires-Dist: pytest-trio>=0.5.2; extra == "test"
|
|
73
76
|
Requires-Dist: pytest-xdist>=2.4.0; extra == "test"
|
|
@@ -108,8 +111,8 @@ ______________________________________________________________________
|
|
|
108
111
|
| **Transport** | **Status** | **Source** |
|
|
109
112
|
| -------------------------------------- | :--------: | :---------------------------------------------------------------------------------: |
|
|
110
113
|
| **`libp2p-tcp`** | ✅ | [source](https://github.com/libp2p/py-libp2p/blob/main/libp2p/transport/tcp/tcp.py) |
|
|
111
|
-
| **`libp2p-quic`** |
|
|
112
|
-
| **`libp2p-websocket`** |
|
|
114
|
+
| **`libp2p-quic`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/quic) |
|
|
115
|
+
| **`libp2p-websocket`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/websocket) |
|
|
113
116
|
| **`libp2p-webrtc-browser-to-server`** | 🌱 | |
|
|
114
117
|
| **`libp2p-webrtc-private-to-private`** | 🌱 | |
|
|
115
118
|
|
|
@@ -141,7 +144,7 @@ ______________________________________________________________________
|
|
|
141
144
|
| **`bootstrap`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/bootstrap) |
|
|
142
145
|
| **`random-walk`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/random_walk) |
|
|
143
146
|
| **`mdns-discovery`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/mdns) |
|
|
144
|
-
| **`rendezvous`** |
|
|
147
|
+
| **`rendezvous`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/rendezvous) |
|
|
145
148
|
|
|
146
149
|
______________________________________________________________________
|
|
147
150
|
|
|
@@ -33,8 +33,8 @@ ______________________________________________________________________
|
|
|
33
33
|
| **Transport** | **Status** | **Source** |
|
|
34
34
|
| -------------------------------------- | :--------: | :---------------------------------------------------------------------------------: |
|
|
35
35
|
| **`libp2p-tcp`** | ✅ | [source](https://github.com/libp2p/py-libp2p/blob/main/libp2p/transport/tcp/tcp.py) |
|
|
36
|
-
| **`libp2p-quic`** |
|
|
37
|
-
| **`libp2p-websocket`** |
|
|
36
|
+
| **`libp2p-quic`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/quic) |
|
|
37
|
+
| **`libp2p-websocket`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/transport/websocket) |
|
|
38
38
|
| **`libp2p-webrtc-browser-to-server`** | 🌱 | |
|
|
39
39
|
| **`libp2p-webrtc-private-to-private`** | 🌱 | |
|
|
40
40
|
|
|
@@ -66,7 +66,7 @@ ______________________________________________________________________
|
|
|
66
66
|
| **`bootstrap`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/bootstrap) |
|
|
67
67
|
| **`random-walk`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/random_walk) |
|
|
68
68
|
| **`mdns-discovery`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/mdns) |
|
|
69
|
-
| **`rendezvous`** |
|
|
69
|
+
| **`rendezvous`** | ✅ | [source](https://github.com/libp2p/py-libp2p/tree/main/libp2p/discovery/rendezvous) |
|
|
70
70
|
|
|
71
71
|
______________________________________________________________________
|
|
72
72
|
|
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
# If extensions (or modules to document with autodoc) are in another directory,
|
|
14
14
|
# add these directories to sys.path here. If the directory is relative to the
|
|
15
15
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
16
|
-
# sys.path.insert(0, os.path.abspath('.'))
|
|
17
16
|
|
|
18
17
|
import doctest
|
|
19
18
|
import os
|
|
20
19
|
import sys
|
|
20
|
+
|
|
21
|
+
sys.path.insert(0, os.path.abspath('..'))
|
|
21
22
|
from unittest.mock import MagicMock
|
|
22
23
|
|
|
23
24
|
try:
|
|
@@ -49,6 +50,21 @@ extensions = [
|
|
|
49
50
|
"sphinx_rtd_theme",
|
|
50
51
|
]
|
|
51
52
|
|
|
53
|
+
# Configure Python domain to prefer canonical imports
|
|
54
|
+
# This helps resolve ambiguous references like ResourceManager
|
|
55
|
+
python_use_unqualified_type_names = False
|
|
56
|
+
|
|
57
|
+
# Configure autodoc to prefer specific imports for ambiguous references
|
|
58
|
+
autodoc_type_aliases = {
|
|
59
|
+
"ResourceManager": "libp2p.rcmgr.ResourceManager",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Suppress specific warnings about ambiguous cross-references
|
|
63
|
+
# Since ResourceManager is intentionally re-exported, both locations are valid
|
|
64
|
+
suppress_warnings = [
|
|
65
|
+
"ref.python", # Suppress ambiguous cross-reference warnings
|
|
66
|
+
]
|
|
67
|
+
|
|
52
68
|
# Add any paths that contain templates here, relative to this directory.
|
|
53
69
|
templates_path = ["_templates"]
|
|
54
70
|
|
|
@@ -290,7 +306,12 @@ texinfo_documents = [
|
|
|
290
306
|
]
|
|
291
307
|
|
|
292
308
|
# Prevent autodoc from trying to import module from tests.factories
|
|
293
|
-
autodoc_mock_imports = [
|
|
309
|
+
autodoc_mock_imports = [
|
|
310
|
+
"tests.factories",
|
|
311
|
+
# Mocked ONLY for Sphinx/autodoc: this module does not exist in the codebase
|
|
312
|
+
# but some doc tools may try to import it. No real code references this import.
|
|
313
|
+
"libp2p.relay.circuit_v2.lib"
|
|
314
|
+
]
|
|
294
315
|
|
|
295
316
|
# Documents to append as an appendix to all manuals.
|
|
296
317
|
# texinfo_appendices = []
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Bitswap example package."""
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import logging
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
import trio
|
|
9
|
+
|
|
10
|
+
# Add parent directory to path for imports
|
|
11
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
12
|
+
|
|
13
|
+
from multiaddr import Multiaddr
|
|
14
|
+
|
|
15
|
+
from libp2p import new_host
|
|
16
|
+
from libp2p.bitswap import BitswapClient
|
|
17
|
+
from libp2p.bitswap.dag import MerkleDag
|
|
18
|
+
from libp2p.peer.peerinfo import info_from_p2p_addr
|
|
19
|
+
from libp2p.utils.address_validation import (
|
|
20
|
+
find_free_port,
|
|
21
|
+
get_available_interfaces,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Configure logging
|
|
25
|
+
logging.basicConfig(
|
|
26
|
+
level=logging.INFO,
|
|
27
|
+
format="%(asctime)s [%(levelname)s] [%(name)s] %(message)s",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Silence verbose loggers
|
|
31
|
+
logging.getLogger("multiaddr.transforms").setLevel(logging.WARNING)
|
|
32
|
+
logging.getLogger("multiaddr.codecs.cid").setLevel(logging.WARNING)
|
|
33
|
+
logging.getLogger("async_service.Manager").setLevel(logging.WARNING)
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def format_size(size_bytes: int) -> str:
|
|
39
|
+
"""Format size in human-readable form."""
|
|
40
|
+
size: float = float(size_bytes)
|
|
41
|
+
for unit in ["B", "KB", "MB", "GB"]:
|
|
42
|
+
if size < 1024:
|
|
43
|
+
return f"{size:.1f} {unit}"
|
|
44
|
+
size /= 1024
|
|
45
|
+
return f"{size:.1f} TB"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def run_provider(file_path: str, port: int = 0):
|
|
49
|
+
"""
|
|
50
|
+
Run the provider node to share a file.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
file_path: Path to the file to share
|
|
54
|
+
port: TCP port to listen on (0 for auto)
|
|
55
|
+
|
|
56
|
+
"""
|
|
57
|
+
file_path_obj = Path(file_path)
|
|
58
|
+
|
|
59
|
+
if not file_path_obj.exists():
|
|
60
|
+
logger.error(f"File not found: {file_path}")
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
file_size = file_path_obj.stat().st_size
|
|
64
|
+
logger.info("=" * 70)
|
|
65
|
+
logger.info("PROVIDER NODE STARTING")
|
|
66
|
+
logger.info("=" * 70)
|
|
67
|
+
logger.info(f"File: {file_path}")
|
|
68
|
+
logger.info(f"Size: {format_size(file_size)}")
|
|
69
|
+
logger.info(f"Port: {port if port > 0 else 'auto'}")
|
|
70
|
+
logger.info("=" * 70)
|
|
71
|
+
|
|
72
|
+
if port <= 0:
|
|
73
|
+
port = find_free_port()
|
|
74
|
+
listen_addrs = get_available_interfaces(port)
|
|
75
|
+
# Create host
|
|
76
|
+
host = new_host()
|
|
77
|
+
|
|
78
|
+
async with host.run(listen_addrs=listen_addrs):
|
|
79
|
+
peer_id = host.get_id()
|
|
80
|
+
logger.info(f"Peer ID: {peer_id}")
|
|
81
|
+
|
|
82
|
+
# Get actual listening addresses
|
|
83
|
+
addrs = host.get_addrs()
|
|
84
|
+
logger.info(f"Listening on {len(addrs)} address(es):")
|
|
85
|
+
for addr in addrs:
|
|
86
|
+
logger.info(f" {addr}")
|
|
87
|
+
|
|
88
|
+
# Start Bitswap
|
|
89
|
+
bitswap = BitswapClient(host)
|
|
90
|
+
await bitswap.start()
|
|
91
|
+
logger.info("✓ Bitswap started")
|
|
92
|
+
|
|
93
|
+
# Create Merkle DAG
|
|
94
|
+
dag = MerkleDag(bitswap)
|
|
95
|
+
|
|
96
|
+
logger.info("")
|
|
97
|
+
logger.info("Adding file to DAG...")
|
|
98
|
+
|
|
99
|
+
# Track progress
|
|
100
|
+
def progress_callback(current: int, total: int, status: str):
|
|
101
|
+
if total > 0:
|
|
102
|
+
percent = current / total * 100
|
|
103
|
+
logger.info(
|
|
104
|
+
f" 📤 {status}: {percent:.1f}% "
|
|
105
|
+
f"({format_size(current)}/{format_size(total)})"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Add file with directory wrapper for filename preservation
|
|
109
|
+
# Always uses Merkle DAG regardless of file size
|
|
110
|
+
root_cid = await dag.add_file(
|
|
111
|
+
file_path, progress_callback=progress_callback, wrap_with_directory=True
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Get all blocks that were stored
|
|
115
|
+
logger.info("")
|
|
116
|
+
logger.info("=" * 70)
|
|
117
|
+
logger.info("BLOCKS CREATED:")
|
|
118
|
+
logger.info("=" * 70)
|
|
119
|
+
all_cids = bitswap.block_store.get_all_cids()
|
|
120
|
+
logger.info(f"Total blocks stored: {len(all_cids)}")
|
|
121
|
+
for i, cid in enumerate(all_cids, 1):
|
|
122
|
+
block_data = await bitswap.block_store.get_block(cid)
|
|
123
|
+
block_size = len(block_data) if block_data else 0
|
|
124
|
+
logger.info(f" {i}. {cid.hex()} ({format_size(block_size)})")
|
|
125
|
+
|
|
126
|
+
logger.info("")
|
|
127
|
+
logger.info("=" * 70)
|
|
128
|
+
logger.info("FILE READY TO SHARE!")
|
|
129
|
+
logger.info("=" * 70)
|
|
130
|
+
|
|
131
|
+
# Get the first address (clean multiaddr without duplicate /p2p/)
|
|
132
|
+
provider_addr = host.get_addrs()[0]
|
|
133
|
+
logger.info(f"Root CID: {root_cid.hex()}")
|
|
134
|
+
logger.info("")
|
|
135
|
+
logger.info("=" * 70)
|
|
136
|
+
logger.info("📋 COPY THIS COMMAND TO RUN CLIENT:")
|
|
137
|
+
logger.info("=" * 70)
|
|
138
|
+
logger.info(
|
|
139
|
+
f"python bitswap.py --mode client "
|
|
140
|
+
f'--provider "{provider_addr}" --cid "{root_cid.hex()}"'
|
|
141
|
+
)
|
|
142
|
+
logger.info("=" * 70)
|
|
143
|
+
logger.info("")
|
|
144
|
+
logger.info("Provider is running. Press Ctrl+C to stop...")
|
|
145
|
+
|
|
146
|
+
# Keep running
|
|
147
|
+
try:
|
|
148
|
+
await trio.sleep_forever()
|
|
149
|
+
except KeyboardInterrupt:
|
|
150
|
+
logger.info("\nShutting down...")
|
|
151
|
+
finally:
|
|
152
|
+
await bitswap.stop()
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
async def run_client(
|
|
156
|
+
provider_multiaddr_str: str,
|
|
157
|
+
root_cid_hex: str,
|
|
158
|
+
output_dir: str = "/tmp",
|
|
159
|
+
port: int = 0,
|
|
160
|
+
):
|
|
161
|
+
"""
|
|
162
|
+
Run the client node to fetch a file.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
provider_multiaddr_str: Provider's multiaddress
|
|
166
|
+
root_cid_hex: Root CID as hex string
|
|
167
|
+
output_dir: Directory to save the file
|
|
168
|
+
port: TCP port to listen on (0 for auto)
|
|
169
|
+
|
|
170
|
+
"""
|
|
171
|
+
output_path = Path(output_dir)
|
|
172
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
173
|
+
|
|
174
|
+
try:
|
|
175
|
+
provider_multiaddr = Multiaddr(provider_multiaddr_str)
|
|
176
|
+
root_cid = bytes.fromhex(root_cid_hex)
|
|
177
|
+
except Exception as e:
|
|
178
|
+
logger.error(f"Invalid input: {e}")
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
logger.info("=" * 70)
|
|
182
|
+
logger.info("CLIENT NODE STARTING")
|
|
183
|
+
logger.info("=" * 70)
|
|
184
|
+
logger.info(f"Provider: {provider_multiaddr}")
|
|
185
|
+
logger.info(f"Root CID: {root_cid_hex}")
|
|
186
|
+
logger.info(f"Output dir: {output_path}")
|
|
187
|
+
logger.info("=" * 70)
|
|
188
|
+
|
|
189
|
+
if port <= 0:
|
|
190
|
+
port = find_free_port()
|
|
191
|
+
listen_addrs = get_available_interfaces(port)
|
|
192
|
+
|
|
193
|
+
# Create host
|
|
194
|
+
host = new_host()
|
|
195
|
+
|
|
196
|
+
async with host.run(listen_addrs=listen_addrs):
|
|
197
|
+
logger.info(f"Client Peer ID: {host.get_id()}")
|
|
198
|
+
|
|
199
|
+
# Start Bitswap
|
|
200
|
+
bitswap = BitswapClient(host)
|
|
201
|
+
await bitswap.start()
|
|
202
|
+
logger.info("✓ Bitswap started")
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
# Connect to provider
|
|
206
|
+
logger.info("")
|
|
207
|
+
logger.info("Connecting to provider...")
|
|
208
|
+
peer_info = info_from_p2p_addr(provider_multiaddr)
|
|
209
|
+
await host.connect(peer_info)
|
|
210
|
+
logger.info("✓ Connected")
|
|
211
|
+
|
|
212
|
+
# Create Merkle DAG
|
|
213
|
+
dag = MerkleDag(bitswap)
|
|
214
|
+
|
|
215
|
+
logger.info("")
|
|
216
|
+
logger.info("Fetching file...")
|
|
217
|
+
|
|
218
|
+
# Progress callback
|
|
219
|
+
def progress_callback(current: int, total: int, status: str):
|
|
220
|
+
if total > 0:
|
|
221
|
+
percent = current / total * 100
|
|
222
|
+
logger.info(
|
|
223
|
+
f" 📥 {status}: {percent:.1f}% "
|
|
224
|
+
f"({format_size(current)}/{format_size(total)})"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# Fetch file with automatic filename extraction
|
|
228
|
+
try:
|
|
229
|
+
file_data, filename = await dag.fetch_file(
|
|
230
|
+
root_cid, progress_callback=progress_callback
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# Show fetch statistics
|
|
234
|
+
logger.info("")
|
|
235
|
+
logger.info("=" * 70)
|
|
236
|
+
logger.info("FETCH STATISTICS:")
|
|
237
|
+
logger.info("=" * 70)
|
|
238
|
+
all_blocks = bitswap.block_store.get_all_cids()
|
|
239
|
+
logger.info(f"Total blocks fetched: {len(all_blocks)}")
|
|
240
|
+
for i, cid in enumerate(all_blocks, 1):
|
|
241
|
+
block_data = await bitswap.block_store.get_block(cid)
|
|
242
|
+
block_size = len(block_data) if block_data else 0
|
|
243
|
+
logger.info(f" ✓ {i}. {cid.hex()} ({format_size(block_size)})")
|
|
244
|
+
|
|
245
|
+
except Exception as fetch_error:
|
|
246
|
+
# Show what failed
|
|
247
|
+
logger.error("")
|
|
248
|
+
logger.error("=" * 70)
|
|
249
|
+
logger.error("FETCH FAILED!")
|
|
250
|
+
logger.error("=" * 70)
|
|
251
|
+
logger.error(f"Error: {fetch_error}")
|
|
252
|
+
|
|
253
|
+
# Show blocks we did get
|
|
254
|
+
all_blocks = bitswap.block_store.get_all_cids()
|
|
255
|
+
if all_blocks:
|
|
256
|
+
logger.error(f"Blocks successfully fetched: {len(all_blocks)}")
|
|
257
|
+
for i, cid in enumerate(all_blocks, 1):
|
|
258
|
+
block_data = await bitswap.block_store.get_block(cid)
|
|
259
|
+
block_size = len(block_data) if block_data else 0
|
|
260
|
+
logger.error(
|
|
261
|
+
f" ✓ {i}. {cid.hex()} ({format_size(block_size)})"
|
|
262
|
+
)
|
|
263
|
+
else:
|
|
264
|
+
logger.error("No blocks were successfully fetched")
|
|
265
|
+
|
|
266
|
+
# Show what we were trying to get
|
|
267
|
+
logger.error("")
|
|
268
|
+
logger.error("Missing/Failed blocks can be seen in the logs above")
|
|
269
|
+
logger.error("=" * 70)
|
|
270
|
+
raise
|
|
271
|
+
|
|
272
|
+
logger.info("")
|
|
273
|
+
logger.info("=" * 70)
|
|
274
|
+
logger.info("FILE DOWNLOADED!")
|
|
275
|
+
logger.info("=" * 70)
|
|
276
|
+
logger.info(f"Size: {format_size(len(file_data))}")
|
|
277
|
+
|
|
278
|
+
# Determine output filename
|
|
279
|
+
if filename:
|
|
280
|
+
output_filename = filename
|
|
281
|
+
logger.info(f"Filename: {filename} (from metadata)")
|
|
282
|
+
else:
|
|
283
|
+
output_filename = f"file_{root_cid_hex[:16]}.bin"
|
|
284
|
+
logger.info(f"Filename: {output_filename} (no metadata)")
|
|
285
|
+
|
|
286
|
+
# Handle filename conflicts
|
|
287
|
+
output_file = output_path / output_filename
|
|
288
|
+
if output_file.exists():
|
|
289
|
+
stem = output_file.stem
|
|
290
|
+
suffix = output_file.suffix
|
|
291
|
+
counter = 1
|
|
292
|
+
while output_file.exists():
|
|
293
|
+
output_file = output_path / f"{stem}_{counter}{suffix}"
|
|
294
|
+
counter += 1
|
|
295
|
+
logger.info(f"⚠ File exists, saving as: {output_file.name}")
|
|
296
|
+
|
|
297
|
+
# Save file
|
|
298
|
+
with open(output_file, "wb") as f:
|
|
299
|
+
f.write(file_data)
|
|
300
|
+
|
|
301
|
+
logger.info(f"✓ Saved to: {output_file}")
|
|
302
|
+
logger.info("=" * 70)
|
|
303
|
+
|
|
304
|
+
except Exception as e:
|
|
305
|
+
logger.error(f"Failed: {e}")
|
|
306
|
+
logger.exception("Full traceback:")
|
|
307
|
+
finally:
|
|
308
|
+
await bitswap.stop()
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def parse_args():
|
|
312
|
+
"""Parse command line arguments."""
|
|
313
|
+
parser = argparse.ArgumentParser(
|
|
314
|
+
description="Bitswap file sharing example - provider and client modes"
|
|
315
|
+
)
|
|
316
|
+
parser.add_argument(
|
|
317
|
+
"--mode",
|
|
318
|
+
required=True,
|
|
319
|
+
choices=["provider", "client"],
|
|
320
|
+
help="Run as provider or client",
|
|
321
|
+
)
|
|
322
|
+
parser.add_argument(
|
|
323
|
+
"--port",
|
|
324
|
+
type=int,
|
|
325
|
+
default=0,
|
|
326
|
+
help="Port to listen on (0 for random, provider mode only)",
|
|
327
|
+
)
|
|
328
|
+
parser.add_argument(
|
|
329
|
+
"--file",
|
|
330
|
+
type=str,
|
|
331
|
+
help="Path to file to share (provider mode only)",
|
|
332
|
+
)
|
|
333
|
+
parser.add_argument(
|
|
334
|
+
"--provider",
|
|
335
|
+
type=str,
|
|
336
|
+
help="Provider's multiaddress (client mode only)",
|
|
337
|
+
)
|
|
338
|
+
parser.add_argument(
|
|
339
|
+
"--cid",
|
|
340
|
+
type=str,
|
|
341
|
+
help="Root CID as hex string (client mode only)",
|
|
342
|
+
)
|
|
343
|
+
parser.add_argument(
|
|
344
|
+
"--output",
|
|
345
|
+
type=str,
|
|
346
|
+
default="/tmp",
|
|
347
|
+
help="Output directory for downloaded files (client mode only, default: /tmp)",
|
|
348
|
+
)
|
|
349
|
+
parser.add_argument(
|
|
350
|
+
"--verbose",
|
|
351
|
+
action="store_true",
|
|
352
|
+
help="Enable verbose logging",
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
args = parser.parse_args()
|
|
356
|
+
|
|
357
|
+
# Set logging level based on verbosity
|
|
358
|
+
if args.verbose:
|
|
359
|
+
logging.getLogger().setLevel(logging.DEBUG)
|
|
360
|
+
else:
|
|
361
|
+
logging.getLogger().setLevel(logging.INFO)
|
|
362
|
+
|
|
363
|
+
# Validate mode-specific arguments
|
|
364
|
+
if args.mode == "provider":
|
|
365
|
+
if not args.file:
|
|
366
|
+
parser.error("--file is required in provider mode")
|
|
367
|
+
elif args.mode == "client":
|
|
368
|
+
if not args.provider or not args.cid:
|
|
369
|
+
parser.error("--provider and --cid are required in client mode")
|
|
370
|
+
|
|
371
|
+
return args
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def main():
|
|
375
|
+
"""Main entry point for the bitswap demo."""
|
|
376
|
+
try:
|
|
377
|
+
args = parse_args()
|
|
378
|
+
logger.info(
|
|
379
|
+
"Running in %s mode",
|
|
380
|
+
args.mode,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
if args.mode == "provider":
|
|
384
|
+
trio.run(run_provider, args.file, args.port)
|
|
385
|
+
elif args.mode == "client":
|
|
386
|
+
trio.run(run_client, args.provider, args.cid, args.output, args.port)
|
|
387
|
+
except Exception as e:
|
|
388
|
+
logger.critical(f"Script failed: {e}", exc_info=True)
|
|
389
|
+
sys.exit(1)
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
if __name__ == "__main__":
|
|
393
|
+
main()
|