@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.5476d83

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 (385) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +22 -9
  4. package/dest/client/factory.d.ts +14 -4
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -24
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +157 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +72 -187
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +373 -177
  16. package/dest/config.d.ts +151 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +183 -34
  19. package/dest/enr/generate-enr.d.ts +11 -3
  20. package/dest/enr/generate-enr.d.ts.map +1 -1
  21. package/dest/enr/generate-enr.js +27 -5
  22. package/dest/enr/index.d.ts +1 -1
  23. package/dest/errors/attestation-pool.error.d.ts +7 -0
  24. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  25. package/dest/errors/attestation-pool.error.js +12 -0
  26. package/dest/errors/reqresp.error.d.ts +1 -1
  27. package/dest/errors/reqresp.error.d.ts.map +1 -1
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +2 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +68 -8
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +214 -63
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -6
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +126 -25
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +19 -6
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +111 -21
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +225 -5
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +9 -15
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +10 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +35 -38
  50. package/dest/mem_pools/interface.d.ts +1 -1
  51. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +62 -13
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +469 -97
  54. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  55. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +34 -10
  56. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/memory_tx_pool.js +133 -36
  58. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  59. package/dest/mem_pools/tx_pool/priority.js +1 -1
  60. package/dest/mem_pools/tx_pool/tx_pool.d.ts +65 -9
  61. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +264 -39
  65. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -2
  66. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/attestation_validator/attestation_validator.js +45 -9
  68. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  69. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  70. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  71. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  72. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/index.js +1 -0
  74. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +6 -2
  75. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +73 -12
  77. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  78. package/dest/msg_validators/index.d.ts +1 -1
  79. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  80. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  81. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  82. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  85. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  87. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  88. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  89. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  90. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  93. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  94. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  96. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  97. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  99. package/dest/msg_validators/tx_validator/factory.d.ts +15 -0
  100. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/factory.js +74 -0
  102. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  103. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  105. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  106. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/index.js +7 -0
  108. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
  109. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  111. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  112. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  114. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  115. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  116. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  117. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +12 -0
  118. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  120. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  121. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  123. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  124. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  126. package/dest/services/data_store.d.ts +1 -1
  127. package/dest/services/data_store.d.ts.map +1 -1
  128. package/dest/services/discv5/discV5_service.d.ts +10 -9
  129. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  130. package/dest/services/discv5/discV5_service.js +63 -36
  131. package/dest/services/dummy_service.d.ts +50 -11
  132. package/dest/services/dummy_service.d.ts.map +1 -1
  133. package/dest/services/dummy_service.js +88 -5
  134. package/dest/services/encoding.d.ts +26 -7
  135. package/dest/services/encoding.d.ts.map +1 -1
  136. package/dest/services/encoding.js +73 -5
  137. package/dest/services/gossipsub/scoring.d.ts +1 -1
  138. package/dest/services/index.d.ts +5 -1
  139. package/dest/services/index.d.ts.map +1 -1
  140. package/dest/services/index.js +4 -0
  141. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  142. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  143. package/dest/services/libp2p/instrumentation.js +164 -0
  144. package/dest/services/libp2p/libp2p_service.d.ts +78 -89
  145. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  146. package/dest/services/libp2p/libp2p_service.js +698 -246
  147. package/dest/services/peer-manager/interface.d.ts +23 -0
  148. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  149. package/dest/services/peer-manager/interface.js +1 -0
  150. package/dest/services/peer-manager/metrics.d.ts +6 -2
  151. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  152. package/dest/services/peer-manager/metrics.js +22 -2
  153. package/dest/services/peer-manager/peer_manager.d.ts +102 -22
  154. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  155. package/dest/services/peer-manager/peer_manager.js +549 -72
  156. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  157. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  158. package/dest/services/peer-manager/peer_scoring.js +40 -2
  159. package/dest/services/reqresp/config.d.ts +11 -9
  160. package/dest/services/reqresp/config.d.ts.map +1 -1
  161. package/dest/services/reqresp/config.js +18 -4
  162. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  163. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  164. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  165. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  166. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  167. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  168. package/dest/services/reqresp/index.d.ts +3 -2
  169. package/dest/services/reqresp/index.d.ts.map +1 -1
  170. package/dest/services/reqresp/index.js +2 -1
  171. package/dest/services/reqresp/interface.d.ts +73 -24
  172. package/dest/services/reqresp/interface.d.ts.map +1 -1
  173. package/dest/services/reqresp/interface.js +45 -26
  174. package/dest/services/reqresp/metrics.d.ts +1 -1
  175. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  176. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  177. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  178. package/dest/services/reqresp/protocols/auth.js +71 -0
  179. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  180. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  181. package/dest/services/reqresp/protocols/block.js +28 -5
  182. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  183. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  184. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  189. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  190. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  191. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  192. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  193. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  194. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  195. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  196. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  197. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  198. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/index.js +2 -0
  200. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  201. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/status.d.ts +39 -7
  203. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  204. package/dest/services/reqresp/protocols/status.js +72 -5
  205. package/dest/services/reqresp/protocols/tx.d.ts +13 -2
  206. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  207. package/dest/services/reqresp/protocols/tx.js +34 -6
  208. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  209. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  210. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  212. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  213. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  214. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  215. package/dest/services/reqresp/reqresp.d.ts +24 -66
  216. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  217. package/dest/services/reqresp/reqresp.js +298 -207
  218. package/dest/services/reqresp/status.d.ts +10 -4
  219. package/dest/services/reqresp/status.d.ts.map +1 -1
  220. package/dest/services/reqresp/status.js +9 -2
  221. package/dest/services/service.d.ts +23 -19
  222. package/dest/services/service.d.ts.map +1 -1
  223. package/dest/services/tx_collection/config.d.ts +25 -0
  224. package/dest/services/tx_collection/config.d.ts.map +1 -0
  225. package/dest/services/tx_collection/config.js +58 -0
  226. package/dest/services/tx_collection/fast_tx_collection.d.ts +50 -0
  227. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  228. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  229. package/dest/services/tx_collection/index.d.ts +3 -0
  230. package/dest/services/tx_collection/index.d.ts.map +1 -0
  231. package/dest/services/tx_collection/index.js +2 -0
  232. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  233. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  234. package/dest/services/tx_collection/instrumentation.js +34 -0
  235. package/dest/services/tx_collection/slow_tx_collection.d.ts +52 -0
  236. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  237. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  238. package/dest/services/tx_collection/tx_collection.d.ts +109 -0
  239. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  240. package/dest/services/tx_collection/tx_collection.js +128 -0
  241. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  242. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  243. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  244. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  245. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  246. package/dest/services/tx_collection/tx_source.js +31 -0
  247. package/dest/services/tx_provider.d.ts +49 -0
  248. package/dest/services/tx_provider.d.ts.map +1 -0
  249. package/dest/services/tx_provider.js +210 -0
  250. package/dest/services/tx_provider_instrumentation.d.ts +13 -0
  251. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  252. package/dest/services/tx_provider_instrumentation.js +34 -0
  253. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  254. package/dest/test-helpers/get-ports.d.ts +1 -1
  255. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  256. package/dest/test-helpers/index.d.ts +2 -1
  257. package/dest/test-helpers/index.d.ts.map +1 -1
  258. package/dest/test-helpers/index.js +1 -0
  259. package/dest/test-helpers/make-enrs.d.ts +1 -1
  260. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  261. package/dest/test-helpers/make-enrs.js +4 -5
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  263. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  264. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  265. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  266. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  267. package/dest/test-helpers/mock-pubsub.js +130 -0
  268. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  269. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  270. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  271. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  272. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  273. package/dest/test-helpers/reqresp-nodes.js +62 -28
  274. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  275. package/dest/testbench/p2p_client_testbench_worker.js +103 -29
  276. package/dest/testbench/parse_log_file.d.ts +1 -1
  277. package/dest/testbench/parse_log_file.js +4 -4
  278. package/dest/testbench/testbench.d.ts +1 -1
  279. package/dest/testbench/testbench.js +4 -4
  280. package/dest/testbench/worker_client_manager.d.ts +1 -6
  281. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  282. package/dest/testbench/worker_client_manager.js +11 -19
  283. package/dest/types/index.d.ts +4 -2
  284. package/dest/types/index.d.ts.map +1 -1
  285. package/dest/types/index.js +2 -0
  286. package/dest/util.d.ts +24 -16
  287. package/dest/util.d.ts.map +1 -1
  288. package/dest/util.js +75 -69
  289. package/dest/versioning.d.ts +4 -4
  290. package/dest/versioning.d.ts.map +1 -1
  291. package/dest/versioning.js +8 -3
  292. package/package.json +32 -27
  293. package/src/bootstrap/bootstrap.ts +27 -11
  294. package/src/client/factory.ts +136 -45
  295. package/src/client/index.ts +1 -0
  296. package/src/client/interface.ts +198 -0
  297. package/src/client/p2p_client.ts +469 -330
  298. package/src/config.ts +305 -134
  299. package/src/enr/generate-enr.ts +39 -6
  300. package/src/errors/attestation-pool.error.ts +13 -0
  301. package/src/index.ts +4 -0
  302. package/src/mem_pools/attestation_pool/attestation_pool.ts +75 -7
  303. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +264 -65
  304. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +173 -34
  305. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +156 -30
  306. package/src/mem_pools/attestation_pool/mocks.ts +11 -10
  307. package/src/mem_pools/instrumentation.ts +43 -44
  308. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +549 -108
  309. package/src/mem_pools/tx_pool/memory_tx_pool.ts +153 -44
  310. package/src/mem_pools/tx_pool/priority.ts +1 -1
  311. package/src/mem_pools/tx_pool/tx_pool.ts +67 -8
  312. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +217 -34
  313. package/src/msg_validators/attestation_validator/attestation_validator.ts +54 -11
  314. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  315. package/src/msg_validators/attestation_validator/index.ts +1 -0
  316. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +82 -14
  317. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  318. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  319. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  320. package/src/msg_validators/tx_validator/block_header_validator.ts +4 -4
  321. package/src/msg_validators/tx_validator/data_validator.ts +81 -69
  322. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  323. package/src/msg_validators/tx_validator/factory.ts +109 -0
  324. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  325. package/src/msg_validators/tx_validator/index.ts +7 -0
  326. package/src/msg_validators/tx_validator/metadata_validator.ts +58 -21
  327. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  328. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  329. package/src/msg_validators/tx_validator/timestamp_validator.ts +46 -0
  330. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  331. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  332. package/src/services/discv5/discV5_service.ts +84 -38
  333. package/src/services/dummy_service.ts +147 -9
  334. package/src/services/encoding.ts +80 -5
  335. package/src/services/index.ts +4 -0
  336. package/src/services/libp2p/instrumentation.ts +167 -0
  337. package/src/services/libp2p/libp2p_service.ts +866 -294
  338. package/src/services/peer-manager/interface.ts +29 -0
  339. package/src/services/peer-manager/metrics.ts +26 -1
  340. package/src/services/peer-manager/peer_manager.ts +654 -78
  341. package/src/services/peer-manager/peer_scoring.ts +46 -3
  342. package/src/services/reqresp/config.ts +26 -9
  343. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  344. package/src/services/reqresp/connection-sampler/connection_sampler.ts +148 -95
  345. package/src/services/reqresp/index.ts +2 -0
  346. package/src/services/reqresp/interface.ts +91 -36
  347. package/src/services/reqresp/metrics.ts +4 -1
  348. package/src/services/reqresp/protocols/auth.ts +83 -0
  349. package/src/services/reqresp/protocols/block.ts +24 -3
  350. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  351. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  352. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  353. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  354. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  355. package/src/services/reqresp/protocols/index.ts +2 -0
  356. package/src/services/reqresp/protocols/status.ts +117 -5
  357. package/src/services/reqresp/protocols/tx.ts +35 -6
  358. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  359. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  360. package/src/services/reqresp/reqresp.ts +387 -256
  361. package/src/services/reqresp/status.ts +12 -3
  362. package/src/services/service.ts +45 -21
  363. package/src/services/tx_collection/config.ts +84 -0
  364. package/src/services/tx_collection/fast_tx_collection.ts +340 -0
  365. package/src/services/tx_collection/index.ts +2 -0
  366. package/src/services/tx_collection/instrumentation.ts +43 -0
  367. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  368. package/src/services/tx_collection/tx_collection.ts +215 -0
  369. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  370. package/src/services/tx_collection/tx_source.ts +37 -0
  371. package/src/services/tx_provider.ts +216 -0
  372. package/src/services/tx_provider_instrumentation.ts +44 -0
  373. package/src/test-helpers/index.ts +1 -0
  374. package/src/test-helpers/make-enrs.ts +4 -5
  375. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  376. package/src/test-helpers/mock-pubsub.ts +188 -0
  377. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  378. package/src/test-helpers/reqresp-nodes.ts +86 -35
  379. package/src/testbench/p2p_client_testbench_worker.ts +151 -25
  380. package/src/testbench/parse_log_file.ts +4 -4
  381. package/src/testbench/testbench.ts +4 -4
  382. package/src/testbench/worker_client_manager.ts +17 -23
  383. package/src/types/index.ts +2 -0
  384. package/src/util.ts +105 -91
  385. package/src/versioning.ts +11 -4
@@ -1,6 +1,14 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import {
5
+ Attributes,
6
+ Metrics,
7
+ type TelemetryClient,
8
+ type UpDownCounter,
9
+ ValueType,
10
+ getTelemetryClient,
11
+ } from '@aztec/telemetry-client';
4
12
 
5
13
  import type { PeerId } from '@libp2p/interface';
6
14
 
@@ -30,7 +38,9 @@ export class PeerScoring {
30
38
  private decayFactor = 0.9;
31
39
  peerPenalties: { [key in PeerErrorSeverity]: number };
32
40
 
33
- constructor(config: P2PConfig) {
41
+ private peerStateCounter: UpDownCounter;
42
+
43
+ constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
34
44
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
35
45
  this.peerPenalties = {
36
46
  [PeerErrorSeverity.HighToleranceError]:
@@ -40,6 +50,13 @@ export class PeerScoring {
40
50
  [PeerErrorSeverity.LowToleranceError]:
41
51
  orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
42
52
  };
53
+
54
+ const meter = telemetry.getMeter('PeerScoring');
55
+
56
+ this.peerStateCounter = meter.createUpDownCounter(Metrics.P2P_PEER_STATE_COUNT, {
57
+ description: 'Count of peers by state (Healthy, Disconnect, Banned)',
58
+ valueType: ValueType.INT,
59
+ });
43
60
  }
44
61
 
45
62
  public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
@@ -99,7 +116,33 @@ export class PeerScoring {
99
116
  return PeerScoreState.Healthy;
100
117
  }
101
118
 
102
- getStats(): { medianScore: number } {
103
- return { medianScore: median(Array.from(this.scores.values())) ?? 0 };
119
+ getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
120
+ const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
121
+
122
+ for (const peerId of this.scores.keys()) {
123
+ const state = this.getScoreState(peerId);
124
+ switch (state) {
125
+ case PeerScoreState.Healthy:
126
+ stateCounts.healthy++;
127
+ break;
128
+ case PeerScoreState.Disconnect:
129
+ stateCounts.disconnect++;
130
+ break;
131
+ case PeerScoreState.Banned:
132
+ stateCounts.banned++;
133
+ break;
134
+ }
135
+ }
136
+
137
+ this.peerStateCounter.add(stateCounts.healthy, { [Attributes.P2P_PEER_SCORE_STATE]: 'Healthy' });
138
+ this.peerStateCounter.add(stateCounts.disconnect, { [Attributes.P2P_PEER_SCORE_STATE]: 'Disconnect' });
139
+ this.peerStateCounter.add(stateCounts.banned, { [Attributes.P2P_PEER_SCORE_STATE]: 'Banned' });
140
+
141
+ return {
142
+ medianScore: median(Array.from(this.scores.values())) ?? 0,
143
+ healthyCount: stateCounts.healthy,
144
+ disconnectCount: stateCounts.disconnect,
145
+ bannedCount: stateCounts.banned,
146
+ };
104
147
  }
105
148
  }
@@ -1,24 +1,30 @@
1
- import { type ConfigMapping, numberConfigHelper } from '@aztec/foundation/config';
1
+ import { type ConfigMapping, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
2
2
 
3
- export const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 2000;
4
- export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 4000;
3
+ export const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 10_000;
4
+ export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 10_000; // Not currently used
5
+ export const DEFAULT_REQRESP_DIAL_TIMEOUT_MS = 5_000;
6
+ export const DEFAULT_OPTIMISTIC_NEGOTIATION = false;
5
7
 
6
8
  // For use in tests.
7
9
  export const DEFAULT_P2P_REQRESP_CONFIG: P2PReqRespConfig = {
8
10
  overallRequestTimeoutMs: DEFAULT_OVERALL_REQUEST_TIMEOUT_MS,
9
11
  individualRequestTimeoutMs: DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
12
+ dialTimeoutMs: DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
13
+ p2pOptimisticNegotiation: DEFAULT_OPTIMISTIC_NEGOTIATION,
10
14
  };
11
15
 
12
16
  export interface P2PReqRespConfig {
13
- /**
14
- * The overall timeout for a request response operation.
15
- */
17
+ /** The overall timeout for a request response operation. */
16
18
  overallRequestTimeoutMs: number;
17
19
 
18
- /**
19
- * The timeout for an individual request response peer interaction.
20
- */
20
+ /** The timeout for an individual request response peer interaction. */
21
21
  individualRequestTimeoutMs: number;
22
+
23
+ /** Whether to use optimistic protocol negotiation when dialing to another peer (opposite of `negotiateFully`). */
24
+ p2pOptimisticNegotiation: boolean;
25
+
26
+ /** How long to wait for the dial protocol to establish a connection */
27
+ dialTimeoutMs: number;
22
28
  }
23
29
 
24
30
  export const p2pReqRespConfigMappings: Record<keyof P2PReqRespConfig, ConfigMapping> = {
@@ -32,4 +38,15 @@ export const p2pReqRespConfigMappings: Record<keyof P2PReqRespConfig, ConfigMapp
32
38
  description: 'The timeout for an individual request response peer interaction.',
33
39
  ...numberConfigHelper(DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS),
34
40
  },
41
+ dialTimeoutMs: {
42
+ env: 'P2P_REQRESP_DIAL_TIMEOUT_MS',
43
+ description: 'How long to wait for the dial protocol to establish a connection',
44
+ ...numberConfigHelper(DEFAULT_REQRESP_DIAL_TIMEOUT_MS),
45
+ },
46
+ p2pOptimisticNegotiation: {
47
+ env: 'P2P_REQRESP_OPTIMISTIC_NEGOTIATION',
48
+ description:
49
+ 'Whether to use optimistic protocol negotiation when dialing to another peer (opposite of `negotiateFully`).',
50
+ ...booleanConfigHelper(DEFAULT_OPTIMISTIC_NEGOTIATION),
51
+ },
35
52
  };
@@ -18,11 +18,16 @@ import type { ConnectionSampler } from './connection_sampler.js';
18
18
  * If a peer fails, it is replaced while maintaining the same bucket.
19
19
  */
20
20
  export class BatchConnectionSampler {
21
- private readonly logger = createLogger('p2p:reqresp:batch-connection-sampler');
22
21
  private readonly batch: PeerId[] = [];
23
22
  private readonly requestsPerPeer: number;
24
23
 
25
- constructor(private readonly connectionSampler: ConnectionSampler, batchSize: number, maxPeers: number) {
24
+ constructor(
25
+ private readonly connectionSampler: ConnectionSampler,
26
+ batchSize: number,
27
+ maxPeers: number,
28
+ exclude?: PeerId[],
29
+ private readonly logger = createLogger('p2p:reqresp:batch-connection-sampler'),
30
+ ) {
26
31
  if (maxPeers <= 0) {
27
32
  throw new Error('Max peers cannot be 0');
28
33
  }
@@ -34,7 +39,8 @@ export class BatchConnectionSampler {
34
39
  this.requestsPerPeer = Math.max(1, Math.floor(batchSize / maxPeers));
35
40
 
36
41
  // Sample initial peers
37
- this.batch = this.connectionSampler.samplePeersBatch(maxPeers);
42
+ const excluding = exclude && new Map(exclude.map(peerId => [peerId.toString(), true] as const));
43
+ this.batch = this.connectionSampler.samplePeersBatch(maxPeers, excluding);
38
44
  }
39
45
 
40
46
  /**
@@ -66,15 +72,15 @@ export class BatchConnectionSampler {
66
72
  }
67
73
 
68
74
  const excluding = new Map([[peerId.toString(), true]]);
69
- const newPeer = this.connectionSampler.getPeer(excluding);
75
+ const newPeer = this.connectionSampler.getPeer(excluding); // Q: Shouldn't we accumulate all excluded peers? Otherwise the sampler could return us a previously excluded peer?
70
76
 
71
77
  if (newPeer) {
72
78
  this.batch[index] = newPeer;
73
- this.logger.trace(`Replaced peer ${peerId} with ${newPeer}`, { peerId, newPeer });
79
+ this.logger.trace('Replaced peer', { peerId, newPeer });
74
80
  } else {
75
81
  // If we couldn't get a replacement, remove the peer and compact the array
76
82
  this.batch.splice(index, 1);
77
- this.logger.trace(`Removed peer ${peerId}`, { peerId });
83
+ this.logger.trace('Removed peer', { peerId });
78
84
  }
79
85
  }
80
86
 
@@ -1,15 +1,10 @@
1
+ import { AbortError } from '@aztec/foundation/error';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
- import { SerialQueue } from '@aztec/foundation/queue';
3
3
 
4
4
  import type { Libp2p, PeerId, Stream } from '@libp2p/interface';
5
5
 
6
6
  const MAX_SAMPLE_ATTEMPTS = 4;
7
7
 
8
- interface StreamAndPeerId {
9
- stream: Stream;
10
- peerId: PeerId;
11
- }
12
-
13
8
  export class RandomSampler {
14
9
  random(max: number) {
15
10
  return Math.floor(Math.random() * max);
@@ -17,31 +12,33 @@ export class RandomSampler {
17
12
  }
18
13
 
19
14
  /**
20
- * A class that samples peers from the libp2p node and returns a peer that we don't already have a connection open to.
15
+ * A class that samples peers from the libp2p node and returns a peer that we don't already have a reqresp connection open to.
21
16
  * If we already have a connection open, we try to sample a different peer.
22
17
  * We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
23
18
  *
24
19
  * @dev Close must always be called on connections, else memory leak
25
20
  */
26
21
  export class ConnectionSampler {
27
- private readonly logger = createLogger('p2p:reqresp:connection-sampler');
28
22
  private cleanupInterval: NodeJS.Timeout;
29
- private abortController: AbortController = new AbortController();
30
23
 
31
- private readonly activeConnectionsCount: Map<PeerId, number> = new Map();
32
- private readonly streams: Map<string, StreamAndPeerId> = new Map();
24
+ // Map from stringified peer id to number of active connections
25
+ protected readonly activeConnectionsCount: Map<string, number> = new Map();
26
+
27
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
28
+ protected readonly streams: Set<Stream> = new Set();
33
29
 
34
- // Serial queue to ensure that we only dial one peer at a time
35
- private dialQueue: SerialQueue = new SerialQueue();
30
+ private abortOnStop: AbortController = new AbortController();
36
31
 
37
32
  constructor(
38
33
  private readonly libp2p: Libp2p,
39
- private readonly cleanupIntervalMs: number = 60000, // Default to 1 minute
40
- private readonly sampler: RandomSampler = new RandomSampler(), // Allow randomness to be mocked for testing
34
+ private readonly sampler: RandomSampler,
35
+ private readonly logger = createLogger('p2p:reqresp:connection-sampler'),
36
+ private readonly opts: { cleanupIntervalMs?: number; p2pOptimisticNegotiation?: boolean } = {},
41
37
  ) {
42
- this.cleanupInterval = setInterval(() => void this.cleanupStaleConnections(), this.cleanupIntervalMs);
43
-
44
- this.dialQueue.start();
38
+ this.cleanupInterval = setInterval(
39
+ () => void this.cleanupStaleConnections(),
40
+ this.opts.cleanupIntervalMs ?? 60_000,
41
+ );
45
42
  }
46
43
 
47
44
  /**
@@ -49,13 +46,11 @@ export class ConnectionSampler {
49
46
  */
50
47
  async stop() {
51
48
  this.logger.info('Stopping connection sampler');
49
+ this.abortOnStop.abort(new AbortError('Connection sampler stopped'));
52
50
  clearInterval(this.cleanupInterval);
53
51
 
54
- this.abortController.abort();
55
- await this.dialQueue.end();
56
-
57
52
  // Close all active streams
58
- const closePromises = Array.from(this.streams.keys()).map(streamId => this.close(streamId));
53
+ const closePromises = Array.from(this.streams.values()).map(stream => this.close(stream));
59
54
  await Promise.all(closePromises);
60
55
  this.logger.info('Connection sampler stopped');
61
56
  }
@@ -69,70 +64,112 @@ export class ConnectionSampler {
69
64
  getPeer(excluding?: Map<string, boolean>): PeerId | undefined {
70
65
  // In libp2p getPeers performs a shallow copy, so this array can be sliced from safetly
71
66
  const peers = this.libp2p.getPeers();
67
+ const { peer } = this.getPeerFromList(peers, excluding);
68
+ return peer;
69
+ }
72
70
 
71
+ /**
72
+ * Samples a peer from a list of peers, excluding those that have active (reqresp) connections or are in the exclusion list
73
+ *
74
+ * @param peers - The list of peers to sample from
75
+ * @param excluding - The peers to exclude from the sampling
76
+ * @returns - A peer from the list, or undefined if no peers are available,
77
+ * - a boolean indicating if the peer has active connections, and
78
+ * - all sampled peers - to enable optional resampling
79
+ *
80
+ * @dev The provided list peers, should be mutated by this function. This allows batch sampling
81
+ * to be performed without making extra copies of the list.
82
+ */
83
+ getPeerFromList(
84
+ peers: PeerId[],
85
+ excluding?: Map<string, boolean>,
86
+ ): {
87
+ peer: PeerId | undefined;
88
+ sampledPeers: PeerId[];
89
+ } {
73
90
  if (peers.length === 0) {
74
- return undefined;
91
+ return { peer: undefined, sampledPeers: [] };
75
92
  }
76
93
 
77
- let randomIndex = this.sampler.random(peers.length);
78
- let attempts = 0;
79
-
80
- // Keep sampling while:
81
- // - we haven't exceeded max attempts AND
82
- // - either the peer has active connections OR is in the exclusion list
83
- while (
84
- attempts < MAX_SAMPLE_ATTEMPTS &&
85
- ((this.activeConnectionsCount.get(peers[randomIndex]) ?? 0) > 0 ||
86
- (excluding?.get(peers[randomIndex]?.toString()) ?? false))
87
- ) {
94
+ const sampledPeers: PeerId[] = [];
95
+ // Try to find a peer that has no active connections and is not in the exclusion list
96
+ for (let attempts = 0; attempts < MAX_SAMPLE_ATTEMPTS && peers.length > 0; attempts++) {
97
+ const randomIndex = this.sampler.random(peers.length);
98
+ const peer = peers[randomIndex];
99
+ const hasActiveConnections = (this.activeConnectionsCount.get(peer.toString()) ?? 0) > 0;
100
+ const isExcluded = excluding?.get(peer.toString()) ?? false;
101
+
102
+ // Remove this peer from consideration
88
103
  peers.splice(randomIndex, 1);
89
- randomIndex = this.sampler.random(peers.length);
90
- attempts++;
104
+
105
+ // If peer is suitable (no active connections and not excluded), return it
106
+ if (!hasActiveConnections && !isExcluded) {
107
+ this.logger.trace('Sampled peer', {
108
+ attempts,
109
+ peer,
110
+ });
111
+ return { peer, sampledPeers };
112
+ }
113
+
114
+ // Keep track of peers that have active reqresp channels, batch sampling will use these to resample
115
+ sampledPeers.push(peer);
91
116
  }
92
117
 
93
- this.logger.trace(`Sampled peer in ${attempts} attempts`, {
94
- attempts,
95
- peer: peers[randomIndex]?.toString(),
118
+ // If we've exhausted our attempts or peers list is empty, return the last peer if available
119
+ const lastPeer = peers.length > 0 ? peers[this.sampler.random(peers.length)] : undefined;
120
+
121
+ this.logger.trace('Sampled peer', {
122
+ attempts: MAX_SAMPLE_ATTEMPTS,
123
+ peer: lastPeer?.toString(),
96
124
  });
97
- return peers[randomIndex];
125
+ return { peer: lastPeer, sampledPeers };
98
126
  }
99
127
 
100
128
  /**
101
129
  * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
102
130
  *
103
131
  * @param numberToSample - The number of peers to sample
132
+ * @param excluding - The peers to exclude from the sampling
104
133
  * @returns Array of unique sampled peers, prioritizing those without active connections
105
134
  */
106
- samplePeersBatch(numberToSample: number): PeerId[] {
135
+ samplePeersBatch(numberToSample: number, excluding?: Map<string, boolean>): PeerId[] {
107
136
  const peers = this.libp2p.getPeers();
108
- const sampledPeers: PeerId[] = [];
109
- const peersWithConnections: PeerId[] = []; // Hold onto peers with active connections incase we need to sample more
110
-
111
- for (const peer of peers) {
112
- const activeConnections = this.activeConnectionsCount.get(peer) ?? 0;
113
- if (activeConnections === 0) {
114
- if (sampledPeers.push(peer) === numberToSample) {
115
- return sampledPeers;
116
- }
117
- } else {
118
- peersWithConnections.push(peer);
137
+ this.logger.debug('Sampling peers batch', { numberToSample, peers });
138
+
139
+ // Only sample as many peers as we have available
140
+ numberToSample = Math.min(numberToSample, peers.length);
141
+
142
+ const batch: PeerId[] = [];
143
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
144
+ const withActiveConnections: Set<PeerId> = new Set();
145
+ for (let i = 0; i < numberToSample; i++) {
146
+ const { peer, sampledPeers } = this.getPeerFromList(peers, excluding);
147
+ if (peer) {
148
+ batch.push(peer);
149
+ }
150
+ if (sampledPeers.length > 0) {
151
+ sampledPeers.forEach(peer => withActiveConnections.add(peer));
119
152
  }
120
153
  }
154
+ const lengthWithoutConnections = batch.length;
121
155
 
122
156
  // If we still need more peers, sample from those with connections
123
- while (sampledPeers.length < numberToSample && peersWithConnections.length > 0) {
124
- const randomIndex = this.sampler.random(peersWithConnections.length);
125
- const [peer] = peersWithConnections.splice(randomIndex, 1);
126
- sampledPeers.push(peer);
157
+ while (batch.length < numberToSample && withActiveConnections.size > 0) {
158
+ const randomIndex = this.sampler.random(withActiveConnections.size);
159
+
160
+ const peer = Array.from(withActiveConnections)[randomIndex];
161
+ withActiveConnections.delete(peer);
162
+ batch.push(peer);
127
163
  }
128
164
 
129
- this.logger.trace(`Batch sampled ${sampledPeers.length} unique peers`, {
130
- peers: sampledPeers,
131
- withoutConnections: sampledPeers.length - peersWithConnections.length,
132
- withConnections: peersWithConnections.length,
165
+ this.logger.trace('Batch sampled peers', {
166
+ length: batch.length,
167
+ peers: batch,
168
+ withoutConnections: lengthWithoutConnections,
169
+ withConnections: numberToSample - lengthWithoutConnections,
133
170
  });
134
171
 
135
- return sampledPeers;
172
+ return batch;
136
173
  }
137
174
 
138
175
  // Set of passthrough functions to keep track of active connections
@@ -142,22 +179,27 @@ export class ConnectionSampler {
142
179
  *
143
180
  * @param peerId - The peer id
144
181
  * @param protocol - The protocol
182
+ * @param timeout - Abort connection if it takes too long
145
183
  * @returns The stream
146
184
  */
147
- async dialProtocol(peerId: PeerId, protocol: string): Promise<Stream> {
148
- // Dialling at the same time can cause race conditions where two different streams
149
- // end up with the same id, hence a serial queue
150
- const stream = await this.dialQueue.put(() =>
151
- this.libp2p.dialProtocol(peerId, protocol, { signal: this.abortController.signal }),
152
- );
185
+ async dialProtocol(peerId: PeerId, protocol: string, timeout?: number): Promise<Stream> {
186
+ const stream = await this.libp2p.dialProtocol(peerId, protocol, {
187
+ signal: AbortSignal.any(
188
+ timeout ? [this.abortOnStop.signal, AbortSignal.timeout(timeout!)] : [this.abortOnStop.signal],
189
+ ),
190
+ negotiateFully: !this.opts.p2pOptimisticNegotiation,
191
+ });
192
+ stream.metadata.peerId = peerId;
193
+ this.streams.add(stream);
153
194
 
154
- this.streams.set(stream.id, { stream, peerId });
155
- const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 0) + 1;
156
- this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
195
+ const peerIdString = peerId.toString();
196
+ const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerIdString) ?? 0) + 1;
197
+ this.activeConnectionsCount.set(peerIdString, updatedActiveConnectionsCount);
157
198
 
158
- this.logger.trace(`Dialed protocol ${protocol} with peer ${peerId.toString()}`, {
199
+ this.logger.trace('Dialed protocol', {
159
200
  streamId: stream.id,
160
- peerId: peerId.toString(),
201
+ protocol,
202
+ peerId: peerIdString,
161
203
  activeConnectionsCount: updatedActiveConnectionsCount,
162
204
  });
163
205
  return stream;
@@ -165,34 +207,39 @@ export class ConnectionSampler {
165
207
 
166
208
  /**
167
209
  * Closes a stream and updates the active connections count
168
- *
169
- * @param streamId - The stream id
170
210
  */
171
- async close(streamId: string): Promise<void> {
172
- try {
173
- const streamAndPeerId = this.streams.get(streamId);
174
- if (!streamAndPeerId) {
175
- this.logger.warn(`Stream ${streamId} not found`);
176
- return;
177
- }
211
+ async close(stream: Stream): Promise<void> {
212
+ let peerId: PeerId | undefined = undefined;
178
213
 
179
- const { stream, peerId } = streamAndPeerId;
214
+ try {
215
+ peerId = stream.metadata.peerId;
216
+ let updatedActiveConnectionsCount = undefined;
180
217
 
181
- const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 1) - 1;
182
- this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
218
+ if (!peerId) {
219
+ this.logger.warn(`Stream ${stream.id} does not have a peerId set`);
220
+ } else {
221
+ updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId.toString()) ?? 1) - 1;
222
+ this.activeConnectionsCount.set(peerId.toString(), updatedActiveConnectionsCount);
223
+ }
183
224
 
184
- this.logger.trace(`Closing connection to peer ${peerId.toString()}`, {
185
- streamId,
186
- peerId: peerId.toString(),
225
+ this.logger.trace('Closing connection', {
226
+ streamId: stream.id,
227
+ peerId: peerId?.toString(),
187
228
  protocol: stream.protocol,
188
229
  activeConnectionsCount: updatedActiveConnectionsCount,
189
230
  });
190
231
 
191
- await stream?.close();
232
+ if (!this.streams.has(stream)) {
233
+ this.logger.debug(`Stream ${stream.id} is not in the active streams set`);
234
+ }
235
+
236
+ await stream.close();
192
237
  } catch (error) {
193
- this.logger.error(`Failed to close connection to peer with stream id ${streamId}`, error);
238
+ this.logger.error(`Failed to close connection to peer ${peerId ?? 'unknown'} with stream id ${stream.id}`, error);
239
+ // graceful close failed, abort the stream
240
+ stream.abort(new AbortError('Failed to close stream gracefully'));
194
241
  } finally {
195
- this.streams.delete(streamId);
242
+ this.streams.delete(stream);
196
243
  }
197
244
  }
198
245
 
@@ -202,15 +249,21 @@ export class ConnectionSampler {
202
249
  private async cleanupStaleConnections() {
203
250
  // Look for streams without anything in the activeConnectionsCount
204
251
  // If we find anything, close the stream
205
- for (const [streamId, { peerId }] of this.streams.entries()) {
252
+ for (const stream of this.streams.values()) {
206
253
  try {
207
254
  // Check if we have lost track of accounting
208
- if (this.activeConnectionsCount.get(peerId) === 0) {
209
- await this.close(streamId);
210
- this.logger.debug(`Cleaned up stale connection ${streamId} to peer ${peerId.toString()}`);
255
+ const peerId: PeerId = stream.metadata.peerId;
256
+ if (!peerId) {
257
+ this.logger.warn(`Stream ${stream.id} does not have a peerId set`);
258
+ } else if (this.activeConnectionsCount.get(peerId.toString()) === 0) {
259
+ await this.close(stream);
260
+ this.logger.debug('Cleaned up stale connection', { streamId: stream.id, peerId: peerId.toString() });
211
261
  }
212
262
  } catch (error) {
213
- this.logger.error(`Error cleaning up stale connection ${streamId}`, { error });
263
+ this.logger.error(
264
+ `Error cleaning up stale connection to peer ${stream.metadata.peerId?.toString() ?? 'unknown'} stream ${stream.id}`,
265
+ { error },
266
+ );
214
267
  }
215
268
  }
216
269
  }
@@ -2,3 +2,5 @@
2
2
  * Request Response protocol allows nodes to ask their peers for data
3
3
  * that they missed via the traditional gossip protocol.
4
4
  */
5
+ export * from './protocols/index.js';
6
+ export * from './interface.js';