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.
Files changed (540) hide show
  1. {libp2p-0.3.0/libp2p.egg-info → libp2p-0.4.0}/PKG-INFO +8 -5
  2. {libp2p-0.3.0 → libp2p-0.4.0}/README.md +3 -3
  3. {libp2p-0.3.0 → libp2p-0.4.0}/docs/conf.py +23 -2
  4. libp2p-0.4.0/examples/bitswap/__init__.py +1 -0
  5. libp2p-0.4.0/examples/bitswap/bitswap.py +393 -0
  6. libp2p-0.4.0/examples/circuit_relay/__init__.py +5 -0
  7. libp2p-0.4.0/examples/circuit_relay/relay_example.py +611 -0
  8. libp2p-0.4.0/examples/doc-examples/example_mplex_timeouts.py +392 -0
  9. libp2p-0.4.0/examples/monitoring-demo/configure.py +31 -0
  10. libp2p-0.4.0/examples/monitoring-demo/run_demo.py +300 -0
  11. libp2p-0.4.0/examples/rendezvous/rendezvous.py +295 -0
  12. libp2p-0.4.0/examples/upnp/upnp_demo.py +45 -0
  13. {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/test_websocket_transport.py +5 -2
  14. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/__init__.py +52 -7
  15. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/abc.py +107 -0
  16. libp2p-0.4.0/libp2p/bitswap/__init__.py +64 -0
  17. libp2p-0.4.0/libp2p/bitswap/block_store.py +109 -0
  18. libp2p-0.4.0/libp2p/bitswap/chunker.py +180 -0
  19. libp2p-0.4.0/libp2p/bitswap/cid.py +236 -0
  20. libp2p-0.4.0/libp2p/bitswap/client.py +860 -0
  21. libp2p-0.4.0/libp2p/bitswap/config.py +39 -0
  22. libp2p-0.4.0/libp2p/bitswap/dag.py +589 -0
  23. libp2p-0.4.0/libp2p/bitswap/dag_pb.py +268 -0
  24. libp2p-0.4.0/libp2p/bitswap/errors.py +51 -0
  25. libp2p-0.4.0/libp2p/bitswap/messages.py +166 -0
  26. libp2p-0.4.0/libp2p/bitswap/pb/__init__.py +1 -0
  27. libp2p-0.4.0/libp2p/bitswap/pb/bitswap_pb2.py +38 -0
  28. libp2p-0.4.0/libp2p/bitswap/pb/bitswap_pb2.pyi +185 -0
  29. libp2p-0.4.0/libp2p/bitswap/pb/dag_pb_pb2.py +28 -0
  30. libp2p-0.4.0/libp2p/bitswap/pb/dag_pb_pb2.pyi +65 -0
  31. libp2p-0.4.0/libp2p/bitswap/pb/unixfs_pb2.py +32 -0
  32. libp2p-0.4.0/libp2p/bitswap/pb/unixfs_pb2.pyi +126 -0
  33. libp2p-0.4.0/libp2p/discovery/rendezvous/__init__.py +37 -0
  34. libp2p-0.4.0/libp2p/discovery/rendezvous/client.py +362 -0
  35. libp2p-0.4.0/libp2p/discovery/rendezvous/config.py +34 -0
  36. libp2p-0.4.0/libp2p/discovery/rendezvous/discovery.py +259 -0
  37. libp2p-0.4.0/libp2p/discovery/rendezvous/errors.py +87 -0
  38. libp2p-0.4.0/libp2p/discovery/rendezvous/messages.py +84 -0
  39. libp2p-0.4.0/libp2p/discovery/rendezvous/pb/__init__.py +7 -0
  40. libp2p-0.4.0/libp2p/discovery/rendezvous/pb/rendezvous_pb2.py +48 -0
  41. libp2p-0.4.0/libp2p/discovery/rendezvous/pb/rendezvous_pb2.pyi +292 -0
  42. libp2p-0.4.0/libp2p/discovery/rendezvous/service.py +332 -0
  43. libp2p-0.4.0/libp2p/discovery/upnp/upnp.py +196 -0
  44. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/basic_host.py +96 -10
  45. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/routed_host.py +29 -1
  46. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/identify.py +15 -22
  47. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/trio.py +11 -6
  48. libp2p-0.4.0/libp2p/kad_dht/common.py +21 -0
  49. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/kad_dht.py +132 -9
  50. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/provider_store.py +4 -0
  51. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/routing_table.py +4 -6
  52. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/value_store.py +10 -8
  53. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/swarm_connection.py +72 -2
  54. libp2p-0.4.0/libp2p/network/stream/net_stream.py +367 -0
  55. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/swarm.py +256 -36
  56. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/id.py +5 -3
  57. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peer_record.py +1 -1
  58. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect_client.py +3 -3
  59. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/gossipsub.py +329 -26
  60. libp2p-0.4.0/libp2p/pubsub/pb/rpc_pb2.py +52 -0
  61. libp2p-0.4.0/libp2p/pubsub/pb/rpc_pb2.pyi +346 -0
  62. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/pubsub.py +47 -3
  63. libp2p-0.4.0/libp2p/pubsub/score.py +299 -0
  64. libp2p-0.4.0/libp2p/rcmgr/__init__.py +21 -0
  65. libp2p-0.4.0/libp2p/rcmgr/allowlist.py +162 -0
  66. libp2p-0.4.0/libp2p/rcmgr/cidr_limits.py +90 -0
  67. libp2p-0.4.0/libp2p/rcmgr/circuit_breaker.py +147 -0
  68. libp2p-0.4.0/libp2p/rcmgr/config.py +598 -0
  69. libp2p-0.4.0/libp2p/rcmgr/connection_lifecycle.py +334 -0
  70. libp2p-0.4.0/libp2p/rcmgr/connection_limits.py +248 -0
  71. libp2p-0.4.0/libp2p/rcmgr/connection_pool.py +147 -0
  72. libp2p-0.4.0/libp2p/rcmgr/connection_tracker.py +470 -0
  73. libp2p-0.4.0/libp2p/rcmgr/enhanced_errors.py +579 -0
  74. libp2p-0.4.0/libp2p/rcmgr/exceptions.py +111 -0
  75. libp2p-0.4.0/libp2p/rcmgr/graceful_degradation.py +258 -0
  76. libp2p-0.4.0/libp2p/rcmgr/health_checks.py +652 -0
  77. libp2p-0.4.0/libp2p/rcmgr/limits.py +8 -0
  78. libp2p-0.4.0/libp2p/rcmgr/manager.py +798 -0
  79. libp2p-0.4.0/libp2p/rcmgr/memory_limits.py +356 -0
  80. libp2p-0.4.0/libp2p/rcmgr/memory_pool.py +128 -0
  81. libp2p-0.4.0/libp2p/rcmgr/memory_stats.py +340 -0
  82. libp2p-0.4.0/libp2p/rcmgr/metrics.py +287 -0
  83. libp2p-0.4.0/libp2p/rcmgr/monitoring.py +723 -0
  84. libp2p-0.4.0/libp2p/rcmgr/prometheus_exporter.py +463 -0
  85. libp2p-0.4.0/libp2p/rcmgr/protocol_rate_limiter.py +649 -0
  86. libp2p-0.4.0/libp2p/rcmgr/rate_limiter.py +714 -0
  87. libp2p-0.4.0/libp2p/rcmgr/token_bucket.py +469 -0
  88. libp2p-0.4.0/libp2p/records/pubkey.py +102 -0
  89. libp2p-0.4.0/libp2p/records/record.py +19 -0
  90. libp2p-0.4.0/libp2p/records/utils.py +27 -0
  91. libp2p-0.4.0/libp2p/records/validator.py +89 -0
  92. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/dcutr.py +4 -3
  93. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/discovery.py +20 -2
  94. libp2p-0.4.0/libp2p/relay/circuit_v2/pb/circuit_pb2.py +40 -0
  95. libp2p-0.4.0/libp2p/relay/circuit_v2/pb/circuit_pb2.pyi +92 -0
  96. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/protocol.py +303 -243
  97. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/protocol_buffer.py +4 -7
  98. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/transport.py +149 -93
  99. libp2p-0.4.0/libp2p/relay/circuit_v2/utils.py +86 -0
  100. libp2p-0.4.0/libp2p/security/__init__.py +24 -0
  101. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/exceptions.py +4 -0
  102. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secure_session.py +5 -0
  103. libp2p-0.4.0/libp2p/security/tls/__init__.py +36 -0
  104. libp2p-0.4.0/libp2p/security/tls/certificate.py +392 -0
  105. libp2p-0.4.0/libp2p/security/tls/io.py +299 -0
  106. libp2p-0.4.0/libp2p/security/tls/transport.py +372 -0
  107. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/mplex_stream.py +130 -23
  108. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/constants.py +29 -1
  109. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/connection.py +66 -20
  110. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/listener.py +2 -2
  111. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/stream.py +8 -0
  112. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/transport.py +4 -2
  113. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/utils.py +6 -10
  114. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/tcp/tcp.py +6 -0
  115. {libp2p-0.3.0 → libp2p-0.4.0/libp2p.egg-info}/PKG-INFO +8 -5
  116. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/SOURCES.txt +143 -14
  117. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/entry_points.txt +1 -0
  118. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/requires.txt +2 -0
  119. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/top_level.txt +1 -0
  120. {libp2p-0.3.0 → libp2p-0.4.0}/pyproject.toml +8 -4
  121. {libp2p-0.3.0 → libp2p-0.4.0}/scripts/release/test_package.py +10 -2
  122. libp2p-0.4.0/tests/core/bitswap/__init__.py +1 -0
  123. libp2p-0.4.0/tests/core/bitswap/conftest.py +40 -0
  124. libp2p-0.4.0/tests/core/bitswap/test_block_store.py +146 -0
  125. libp2p-0.4.0/tests/core/bitswap/test_chunker.py +378 -0
  126. libp2p-0.4.0/tests/core/bitswap/test_cid.py +122 -0
  127. libp2p-0.4.0/tests/core/bitswap/test_client.py +303 -0
  128. libp2p-0.4.0/tests/core/bitswap/test_dag.py +567 -0
  129. libp2p-0.4.0/tests/core/bitswap/test_dag_pb.py +319 -0
  130. libp2p-0.4.0/tests/core/bitswap/test_integration.py +438 -0
  131. libp2p-0.4.0/tests/core/bitswap/test_messages.py +175 -0
  132. libp2p-0.4.0/tests/core/bitswap/test_protocol_versions.py +534 -0
  133. libp2p-0.4.0/tests/core/discovery/rendezvous/__init__.py +1 -0
  134. libp2p-0.4.0/tests/core/discovery/rendezvous/test_client.py +260 -0
  135. libp2p-0.4.0/tests/core/discovery/rendezvous/test_config.py +123 -0
  136. libp2p-0.4.0/tests/core/discovery/rendezvous/test_discovery.py +290 -0
  137. libp2p-0.4.0/tests/core/discovery/rendezvous/test_errors.py +250 -0
  138. libp2p-0.4.0/tests/core/discovery/rendezvous/test_integration.py +394 -0
  139. libp2p-0.4.0/tests/core/discovery/rendezvous/test_messages.py +359 -0
  140. libp2p-0.4.0/tests/core/discovery/rendezvous/test_service.py +390 -0
  141. libp2p-0.4.0/tests/core/discovery/upnp/test_upnp.py +209 -0
  142. libp2p-0.4.0/tests/core/io/test_trio_error_handling.py +136 -0
  143. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_kad_dht.py +125 -26
  144. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_value_store.py +47 -21
  145. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_net_stream.py +4 -4
  146. libp2p-0.4.0/tests/core/network/test_net_stream_concurrency.py +423 -0
  147. libp2p-0.4.0/tests/core/network/test_net_stream_error_state.py +223 -0
  148. libp2p-0.4.0/tests/core/network/test_net_stream_state_transitions.py +113 -0
  149. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_dummyaccount_demo.py +3 -3
  150. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_get_message_id.py +119 -0
  151. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_px_and_backoff.py +12 -0
  152. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v12.py +281 -0
  153. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v12_integration.py +185 -0
  154. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_core_functionality.py +173 -0
  155. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_flood_publishing.py +333 -0
  156. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_ihave_iwant.py +270 -0
  157. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_invalid_behavior.py +301 -0
  158. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_network_scenarios.py +301 -0
  159. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_opportunistic_grafting.py +371 -0
  160. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_peer_scoring.py +867 -0
  161. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_peer_scoring_behavior.py +231 -0
  162. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_score_gates.py +661 -0
  163. libp2p-0.4.0/tests/core/pubsub/test_gossipsub_v1_1_signed_peer_records.py +509 -0
  164. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_pubsub.py +36 -0
  165. libp2p-0.4.0/tests/core/rcmgr/__init__.py +6 -0
  166. libp2p-0.4.0/tests/core/rcmgr/test_cidr_limits.py +24 -0
  167. libp2p-0.4.0/tests/core/rcmgr/test_connection_protection.py +144 -0
  168. libp2p-0.4.0/tests/core/rcmgr/test_enum_string_conversion.py +57 -0
  169. libp2p-0.4.0/tests/core/rcmgr/test_hierarchical_scopes.py +48 -0
  170. libp2p-0.4.0/tests/core/rcmgr/test_preupgrade_admission.py +20 -0
  171. libp2p-0.4.0/tests/core/rcmgr/test_rate_limiting.py +46 -0
  172. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_config.py +447 -0
  173. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_core.py +326 -0
  174. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_health_checks.py +350 -0
  175. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_integration.py +61 -0
  176. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_metrics.py +317 -0
  177. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_monitoring.py +414 -0
  178. libp2p-0.4.0/tests/core/rcmgr/test_rcmgr_simple.py +143 -0
  179. libp2p-0.4.0/tests/core/rcmgr/test_resource_manager_integration.py +74 -0
  180. libp2p-0.4.0/tests/core/records/test_validator.py +145 -0
  181. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_discovery.py +1 -1
  182. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_protocol.py +302 -4
  183. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_circuit_v2_transport.py +133 -3
  184. libp2p-0.4.0/tests/core/security/tls/test_certificate.py +44 -0
  185. libp2p-0.4.0/tests/core/security/tls/test_tls.py +62 -0
  186. libp2p-0.4.0/tests/core/security/tls/test_transport_security.py +179 -0
  187. libp2p-0.4.0/tests/core/stream_muxer/test_mplex_stream.py +559 -0
  188. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_based_service.py +2 -0
  189. libp2p-0.4.0/tests/core/tools/test_bind_address_config.py +162 -0
  190. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_websocket.py +10 -9
  191. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/factories.py +57 -0
  192. libp2p-0.4.0/tests/utils/pubsub/__init__.py +0 -0
  193. libp2p-0.3.0/examples/doc-examples/example_net_stream.py +0 -271
  194. libp2p-0.3.0/libp2p/kad_dht/common.py +0 -14
  195. libp2p-0.3.0/libp2p/network/stream/net_stream.py +0 -314
  196. libp2p-0.3.0/libp2p/pubsub/pb/rpc_pb2.py +0 -52
  197. libp2p-0.3.0/libp2p/pubsub/pb/rpc_pb2.pyi +0 -132
  198. libp2p-0.3.0/libp2p/relay/circuit_v2/pb/circuit_pb2.py +0 -39
  199. libp2p-0.3.0/libp2p/relay/circuit_v2/pb/circuit_pb2.pyi +0 -184
  200. libp2p-0.3.0/tests/core/stream_muxer/test_mplex_stream.py +0 -252
  201. {libp2p-0.3.0 → libp2p-0.4.0}/LICENSE-APACHE +0 -0
  202. {libp2p-0.3.0 → libp2p-0.4.0}/LICENSE-MIT +0 -0
  203. {libp2p-0.3.0 → libp2p-0.4.0}/MANIFEST.in +0 -0
  204. {libp2p-0.3.0 → libp2p-0.4.0}/examples/__init__.py +0 -0
  205. {libp2p-0.3.0 → libp2p-0.4.0}/examples/advanced/network_discover.py +0 -0
  206. {libp2p-0.3.0 → libp2p-0.4.0}/examples/bootstrap/bootstrap.py +0 -0
  207. {libp2p-0.3.0 → libp2p-0.4.0}/examples/chat/__init__.py +0 -0
  208. {libp2p-0.3.0 → libp2p-0.4.0}/examples/chat/chat.py +0 -0
  209. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_insecure.py +0 -0
  210. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_noise.py +0 -0
  211. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_encryption_secio.py +0 -0
  212. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_multiplexer.py +0 -0
  213. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_peer_discovery.py +0 -0
  214. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_quic_transport.py +0 -0
  215. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_running.py +0 -0
  216. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/example_transport.py +0 -0
  217. {libp2p-0.3.0 → libp2p-0.4.0}/examples/doc-examples/multiple_connections_example.py +0 -0
  218. {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/__init__.py +0 -0
  219. {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/echo.py +0 -0
  220. {libp2p-0.3.0 → libp2p-0.4.0}/examples/echo/echo_quic.py +0 -0
  221. {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify/__init__.py +0 -0
  222. {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify/identify.py +0 -0
  223. {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/__init__.py +0 -0
  224. {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/identify_push_demo.py +0 -0
  225. {libp2p-0.3.0 → libp2p-0.4.0}/examples/identify_push/identify_push_listener_dialer.py +0 -0
  226. {libp2p-0.3.0 → libp2p-0.4.0}/examples/kademlia/kademlia.py +0 -0
  227. {libp2p-0.3.0 → libp2p-0.4.0}/examples/mDNS/mDNS.py +0 -0
  228. {libp2p-0.3.0 → libp2p-0.4.0}/examples/ping/__init__.py +0 -0
  229. {libp2p-0.3.0 → libp2p-0.4.0}/examples/ping/ping.py +0 -0
  230. {libp2p-0.3.0 → libp2p-0.4.0}/examples/pubsub/pubsub.py +0 -0
  231. {libp2p-0.3.0 → libp2p-0.4.0}/examples/random_walk/random_walk.py +0 -0
  232. {libp2p-0.3.0 → libp2p-0.4.0}/examples/test_tcp_data_transfer.py +0 -0
  233. {libp2p-0.3.0 → libp2p-0.4.0}/examples/transport_integration_demo.py +0 -0
  234. {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/test_tcp_echo.py +0 -0
  235. {libp2p-0.3.0 → libp2p-0.4.0}/examples/websocket/websocket_demo.py +0 -0
  236. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/__init__.py +0 -0
  237. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/authenticated_encryption.py +0 -0
  238. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/ecc.py +0 -0
  239. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/ed25519.py +0 -0
  240. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/exceptions.py +0 -0
  241. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/key_exchange.py +0 -0
  242. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/keys.py +0 -0
  243. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/__init__.py +0 -0
  244. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/crypto_pb2.py +0 -0
  245. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/pb/crypto_pb2.pyi +0 -0
  246. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/rsa.py +0 -0
  247. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/secp256k1.py +0 -0
  248. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/serialization.py +0 -0
  249. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/crypto/x25519.py +0 -0
  250. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/custom_types.py +0 -0
  251. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/__init__.py +0 -0
  252. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/__init__.py +0 -0
  253. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/bootstrap.py +0 -0
  254. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/bootstrap/utils.py +0 -0
  255. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/events/__init__.py +0 -0
  256. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/events/peerDiscovery.py +0 -0
  257. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/__init__.py +0 -0
  258. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/broadcaster.py +0 -0
  259. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/listener.py +0 -0
  260. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/mdns.py +0 -0
  261. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/mdns/utils.py +0 -0
  262. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/__init__.py +0 -0
  263. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/config.py +0 -0
  264. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/exceptions.py +0 -0
  265. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/random_walk.py +0 -0
  266. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/discovery/random_walk/rt_refresh_manager.py +0 -0
  267. {libp2p-0.3.0/libp2p/host → libp2p-0.4.0/libp2p/discovery/upnp}/__init__.py +0 -0
  268. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/exceptions.py +0 -0
  269. {libp2p-0.3.0/libp2p/host/autonat/pb → libp2p-0.4.0/libp2p/host}/__init__.py +0 -0
  270. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/__init__.py +0 -0
  271. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/autonat.py +0 -0
  272. {libp2p-0.3.0/libp2p/identity/identify → libp2p-0.4.0/libp2p/host/autonat}/pb/__init__.py +0 -0
  273. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2.py +0 -0
  274. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2.pyi +0 -0
  275. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2_grpc.py +0 -0
  276. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/autonat_pb2_grpc.pyi +0 -0
  277. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/autonat/pb/generate_proto.py +0 -0
  278. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/defaults.py +0 -0
  279. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/exceptions.py +0 -0
  280. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/host/ping.py +0 -0
  281. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/__init__.py +0 -0
  282. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/__init__.py +0 -0
  283. {libp2p-0.3.0/libp2p/io → libp2p-0.4.0/libp2p/identity/identify/pb}/__init__.py +0 -0
  284. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/pb/identify_pb2.py +0 -0
  285. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify/pb/identify_pb2.pyi +0 -0
  286. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify_push/__init__.py +0 -0
  287. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/identity/identify_push/identify_push.py +0 -0
  288. {libp2p-0.3.0/libp2p/kad_dht/pb → libp2p-0.4.0/libp2p/io}/__init__.py +0 -0
  289. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/abc.py +0 -0
  290. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/exceptions.py +0 -0
  291. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/msgio.py +0 -0
  292. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/io/utils.py +0 -0
  293. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/__init__.py +0 -0
  294. {libp2p-0.3.0/libp2p/network → libp2p-0.4.0/libp2p/kad_dht/pb}/__init__.py +0 -0
  295. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/pb/kademlia_pb2.py +0 -0
  296. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/pb/kademlia_pb2.pyi +0 -0
  297. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/peer_routing.py +0 -0
  298. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/kad_dht/utils.py +0 -0
  299. {libp2p-0.3.0/libp2p/network/connection → libp2p-0.4.0/libp2p/network}/__init__.py +0 -0
  300. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/config.py +0 -0
  301. {libp2p-0.3.0/libp2p/network/stream → libp2p-0.4.0/libp2p/network/connection}/__init__.py +0 -0
  302. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/exceptions.py +0 -0
  303. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/connection/raw_connection.py +0 -0
  304. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/exceptions.py +0 -0
  305. {libp2p-0.3.0/libp2p/peer → libp2p-0.4.0/libp2p/network/stream}/__init__.py +0 -0
  306. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/network/stream/exceptions.py +0 -0
  307. {libp2p-0.3.0/libp2p/protocol_muxer → libp2p-0.4.0/libp2p/peer}/__init__.py +0 -0
  308. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/envelope.py +0 -0
  309. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/crypto_pb2.py +0 -0
  310. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/crypto_pb2.pyi +0 -0
  311. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/envelope_pb2.py +0 -0
  312. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/envelope_pb2.pyi +0 -0
  313. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/peer_record_pb2.py +0 -0
  314. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/pb/peer_record_pb2.pyi +0 -0
  315. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerdata.py +0 -0
  316. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerinfo.py +0 -0
  317. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/peer/peerstore.py +0 -0
  318. {libp2p-0.3.0/libp2p/pubsub → libp2p-0.4.0/libp2p/protocol_muxer}/__init__.py +0 -0
  319. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/exceptions.py +0 -0
  320. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect.py +0 -0
  321. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/protocol_muxer/multiselect_communicator.py +0 -0
  322. {libp2p-0.3.0/libp2p/pubsub/pb → libp2p-0.4.0/libp2p/pubsub}/__init__.py +0 -0
  323. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/exceptions.py +0 -0
  324. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/floodsub.py +0 -0
  325. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/mcache.py +0 -0
  326. {libp2p-0.3.0/libp2p/security → libp2p-0.4.0/libp2p/pubsub/pb}/__init__.py +0 -0
  327. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/pubsub_notifee.py +0 -0
  328. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/subscription.py +0 -0
  329. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/utils.py +0 -0
  330. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/pubsub/validators.py +0 -0
  331. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/py.typed +0 -0
  332. {libp2p-0.3.0/libp2p/security/insecure → libp2p-0.4.0/libp2p/records}/__init__.py +0 -0
  333. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/__init__.py +0 -0
  334. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/__init__.py +0 -0
  335. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/config.py +0 -0
  336. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/nat.py +0 -0
  337. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/__init__.py +0 -0
  338. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/dcutr_pb2.py +0 -0
  339. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/pb/dcutr_pb2.pyi +0 -0
  340. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/relay/circuit_v2/resources.py +0 -0
  341. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/base_session.py +0 -0
  342. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/base_transport.py +0 -0
  343. {libp2p-0.3.0/libp2p/security/insecure/pb → libp2p-0.4.0/libp2p/security/insecure}/__init__.py +0 -0
  344. {libp2p-0.3.0/libp2p/security/noise → libp2p-0.4.0/libp2p/security/insecure/pb}/__init__.py +0 -0
  345. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/pb/plaintext_pb2.py +0 -0
  346. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/pb/plaintext_pb2.pyi +0 -0
  347. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/insecure/transport.py +0 -0
  348. {libp2p-0.3.0/libp2p/security/noise/pb → libp2p-0.4.0/libp2p/security/noise}/__init__.py +0 -0
  349. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/exceptions.py +0 -0
  350. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/io.py +0 -0
  351. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/messages.py +0 -0
  352. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/patterns.py +0 -0
  353. {libp2p-0.3.0/libp2p/security/secio → libp2p-0.4.0/libp2p/security/noise/pb}/__init__.py +0 -0
  354. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/pb/noise_pb2.py +0 -0
  355. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/pb/noise_pb2.pyi +0 -0
  356. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/noise/transport.py +0 -0
  357. {libp2p-0.3.0/libp2p/security/secio/pb → libp2p-0.4.0/libp2p/security/secio}/__init__.py +0 -0
  358. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/exceptions.py +0 -0
  359. {libp2p-0.3.0/libp2p/stream_muxer → libp2p-0.4.0/libp2p/security/secio/pb}/__init__.py +0 -0
  360. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/pb/spipe_pb2.py +0 -0
  361. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/pb/spipe_pb2.pyi +0 -0
  362. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/secio/transport.py +0 -0
  363. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/security/security_multistream.py +0 -0
  364. {libp2p-0.3.0/libp2p/stream_muxer/mplex → libp2p-0.4.0/libp2p/stream_muxer}/__init__.py +0 -0
  365. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/exceptions.py +0 -0
  366. {libp2p-0.3.0/libp2p/tools → libp2p-0.4.0/libp2p/stream_muxer/mplex}/__init__.py +0 -0
  367. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/constants.py +0 -0
  368. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/datastructures.py +0 -0
  369. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/exceptions.py +0 -0
  370. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/mplex/mplex.py +0 -0
  371. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/muxer_multistream.py +0 -0
  372. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/rw_lock.py +0 -0
  373. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/yamux/__init__.py +0 -0
  374. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/stream_muxer/yamux/yamux.py +0 -0
  375. {libp2p-0.3.0/libp2p/tools/timed_cache → libp2p-0.4.0/libp2p/tools}/__init__.py +0 -0
  376. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/__init__.py +0 -0
  377. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/_utils.py +0 -0
  378. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/abc.py +0 -0
  379. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/base.py +0 -0
  380. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/exceptions.py +0 -0
  381. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/stats.py +0 -0
  382. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/trio_service.py +0 -0
  383. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/async_service/typing.py +0 -0
  384. {libp2p-0.3.0/libp2p/transport/quic → libp2p-0.4.0/libp2p/tools/timed_cache}/__init__.py +0 -0
  385. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/base_timed_cache.py +0 -0
  386. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/first_seen_cache.py +0 -0
  387. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/timed_cache/last_seen_cache.py +0 -0
  388. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/tools/utils.py +0 -0
  389. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/__init__.py +0 -0
  390. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/exceptions.py +0 -0
  391. {libp2p-0.3.0/libp2p/transport/tcp → libp2p-0.4.0/libp2p/transport/quic}/__init__.py +0 -0
  392. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/config.py +0 -0
  393. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/exceptions.py +0 -0
  394. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/quic/security.py +0 -0
  395. {libp2p-0.3.0/tests → libp2p-0.4.0/libp2p/transport/tcp}/__init__.py +0 -0
  396. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/transport_registry.py +0 -0
  397. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/upgrader.py +0 -0
  398. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/connection.py +0 -0
  399. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/listener.py +0 -0
  400. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/multiaddr_utils.py +0 -0
  401. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/transport/websocket/transport.py +0 -0
  402. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/__init__.py +0 -0
  403. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/address_validation.py +0 -0
  404. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/logging.py +0 -0
  405. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/paths.py +0 -0
  406. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/varint.py +0 -0
  407. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p/utils/version.py +0 -0
  408. {libp2p-0.3.0 → libp2p-0.4.0}/libp2p.egg-info/dependency_links.txt +0 -0
  409. {libp2p-0.3.0 → libp2p-0.4.0}/newsfragments/validate_files.py +0 -0
  410. {libp2p-0.3.0 → libp2p-0.4.0}/scripts/audit_paths.py +0 -0
  411. {libp2p-0.3.0 → libp2p-0.4.0}/setup.cfg +0 -0
  412. {libp2p-0.3.0/tests/discovery/mdns → libp2p-0.4.0/tests}/__init__.py +0 -0
  413. {libp2p-0.3.0 → libp2p-0.4.0}/tests/conftest.py +0 -0
  414. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_ed25519.py +0 -0
  415. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_rsa.py +0 -0
  416. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_secp256k1.py +0 -0
  417. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/crypto/test_x25519.py +0 -0
  418. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/__init__.py +0 -0
  419. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/__init__.py +0 -0
  420. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/test_integration.py +0 -0
  421. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/bootstrap/test_utils.py +0 -0
  422. {libp2p-0.3.0/tests/interop → libp2p-0.4.0/tests/core/discovery/mdns}/__init__.py +0 -0
  423. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_broadcaster.py +0 -0
  424. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_listener.py +0 -0
  425. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_mdns.py +0 -0
  426. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/mdns/test_utils.py +0 -0
  427. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/random_walk/test_random_walk.py +0 -0
  428. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/discovery/random_walk/test_rt_refresh_manager.py +0 -0
  429. {libp2p-0.3.0/tests → libp2p-0.4.0/tests/core}/exceptions/test_exceptions.py +0 -0
  430. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_autonat.py +0 -0
  431. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_basic_host.py +0 -0
  432. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_connected_peers.py +0 -0
  433. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_live_peers.py +0 -0
  434. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_ping.py +0 -0
  435. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/host/test_routed_host.py +0 -0
  436. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify/test_identify.py +0 -0
  437. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify/test_identify_integration.py +0 -0
  438. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify_push/test_identify_push.py +0 -0
  439. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/identity/identify_push/test_identify_push_integration.py +0 -0
  440. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_peer_routing.py +0 -0
  441. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_provider_store.py +0 -0
  442. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/kad_dht/test_unit_routing_table.py +0 -0
  443. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/conftest.py +0 -0
  444. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_enhanced_swarm.py +0 -0
  445. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notifee_performance.py +0 -0
  446. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notify.py +0 -0
  447. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_notify_listen_lifecycle.py +0 -0
  448. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_swarm.py +0 -0
  449. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/network/test_swarm_conn.py +0 -0
  450. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_addrbook.py +0 -0
  451. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_envelope.py +0 -0
  452. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_interop.py +0 -0
  453. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peer_record.py +0 -0
  454. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerdata.py +0 -0
  455. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerid.py +0 -0
  456. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerinfo.py +0 -0
  457. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peermetadata.py +0 -0
  458. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/peer/test_peerstore.py +0 -0
  459. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/protocol_muxer/test_negotiate_timeout.py +0 -0
  460. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/protocol_muxer/test_protocol_muxer.py +0 -0
  461. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_floodsub.py +0 -0
  462. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub.py +0 -0
  463. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_backward_compatibility.py +0 -0
  464. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_gossipsub_direct_peers.py +0 -0
  465. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_mcache.py +0 -0
  466. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_pubsub_notifee_integration.py +0 -0
  467. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/pubsub/test_subscription.py +0 -0
  468. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_dcutr_integration.py +0 -0
  469. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_dcutr_protocol.py +0 -0
  470. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/relay/test_nat.py +0 -0
  471. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/noise/test_msg_read_writer.py +0 -0
  472. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/noise/test_noise.py +0 -0
  473. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_insecure_peerstore_integration.py +0 -0
  474. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_secio.py +0 -0
  475. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/security/test_security_multistream.py +0 -0
  476. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/conftest.py +0 -0
  477. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_async_context_manager.py +0 -0
  478. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_mplex_conn.py +0 -0
  479. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_multiplexer_selection.py +0 -0
  480. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_muxer_multistream.py +0 -0
  481. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_read_write_lock.py +0 -0
  482. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux.py +0 -0
  483. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux_interleaving.py +0 -0
  484. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/stream_muxer/test_yamux_interleaving_EOF.py +0 -0
  485. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/test_import_and_version.py +0 -0
  486. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/test_libp2p/test_libp2p.py +0 -0
  487. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_external_api.py +0 -0
  488. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/async_service/test_trio_manager_stats.py +0 -0
  489. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/tools/timed_cache/test_timed_cache.py +0 -0
  490. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_concurrency.py +0 -0
  491. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_connection.py +0 -0
  492. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_connection_id.py +0 -0
  493. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_integration.py +0 -0
  494. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_listener.py +0 -0
  495. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_transport.py +0 -0
  496. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/quic/test_utils.py +0 -0
  497. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_tcp.py +0 -0
  498. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_transport_registry.py +0 -0
  499. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_upgrader.py +0 -0
  500. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/transport/test_websocket_p2p.py +0 -0
  501. {libp2p-0.3.0 → libp2p-0.4.0}/tests/core/utils/test_varint.py +0 -0
  502. {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_echo_thin_waist.py +0 -0
  503. {libp2p-0.3.0/tests/core → libp2p-0.4.0/tests}/examples/test_examples.py +0 -0
  504. {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_examples_bind_address.py +0 -0
  505. {libp2p-0.3.0 → libp2p-0.4.0}/tests/examples/test_quic_echo_example.py +0 -0
  506. {libp2p-0.3.0/tests/utils → libp2p-0.4.0/tests/interop}/__init__.py +0 -0
  507. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/go_libp2p/test_go_basic.py +0 -0
  508. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/README.md +0 -0
  509. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/README.md +0 -0
  510. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/package.json +0 -0
  511. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/package.json +0 -0
  512. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping.js +0 -0
  513. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping_client.js +0 -0
  514. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ping_server.js +0 -0
  515. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/js_node/src/ws_ping_node.mjs +0 -0
  516. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/scripts/run_test.ps1 +0 -0
  517. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/js_libp2p/scripts/run_test.sh +0 -0
  518. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/.gitignore +0 -0
  519. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/conftest.py +0 -0
  520. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/nim_echo_server.nim +0 -0
  521. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/scripts/setup_nim_echo.sh +0 -0
  522. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/nim_libp2p/test_echo_interop.py +0 -0
  523. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/rust_libp2p/test_rust_basic.py +0 -0
  524. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/test_js_ws_ping.py +0 -0
  525. {libp2p-0.3.0 → libp2p-0.4.0}/tests/interop/zig_libp2p/test_zig_basic.py +0 -0
  526. {libp2p-0.3.0/tests/utils/interop → libp2p-0.4.0/tests/utils}/__init__.py +0 -0
  527. {libp2p-0.3.0/tests/utils/pubsub → libp2p-0.4.0/tests/utils/interop}/__init__.py +0 -0
  528. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/constants.py +0 -0
  529. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/daemon.py +0 -0
  530. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/envs.py +0 -0
  531. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/process.py +0 -0
  532. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/interop/utils.py +0 -0
  533. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/dummy_account_node.py +0 -0
  534. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/floodsub_integration_test_settings.py +0 -0
  535. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/pubsub/utils.py +0 -0
  536. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_address_validation.py +0 -0
  537. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_default_bind_address.py +0 -0
  538. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_logging.py +0 -0
  539. {libp2p-0.3.0 → libp2p-0.4.0}/tests/utils/test_paths.py +0 -0
  540. {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.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 = ["tests.factories"]
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()
@@ -0,0 +1,5 @@
1
+ """
2
+ Circuit Relay v2 example module.
3
+
4
+ This package demonstrates the usage of Circuit Relay v2 protocol in libp2p.
5
+ """