@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.023c3e5

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 (512) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +26 -13
  4. package/dest/client/factory.d.ts +15 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +61 -25
  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 +170 -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 +75 -193
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +765 -229
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  19. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  20. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  21. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  22. package/dest/config.d.ts +154 -125
  23. package/dest/config.d.ts.map +1 -1
  24. package/dest/config.js +182 -34
  25. package/dest/enr/generate-enr.d.ts +11 -3
  26. package/dest/enr/generate-enr.d.ts.map +1 -1
  27. package/dest/enr/generate-enr.js +27 -5
  28. package/dest/enr/index.d.ts +1 -1
  29. package/dest/errors/attestation-pool.error.d.ts +7 -0
  30. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  31. package/dest/errors/attestation-pool.error.js +12 -0
  32. package/dest/errors/reqresp.error.d.ts +1 -1
  33. package/dest/errors/reqresp.error.d.ts.map +1 -1
  34. package/dest/index.d.ts +4 -1
  35. package/dest/index.d.ts.map +1 -1
  36. package/dest/index.js +2 -0
  37. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  38. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  40. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +299 -174
  42. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  43. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  44. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  46. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  47. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  48. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  49. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  50. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  51. package/dest/mem_pools/attestation_pool/mocks.js +19 -21
  52. package/dest/mem_pools/index.d.ts +1 -1
  53. package/dest/mem_pools/instrumentation.d.ts +16 -12
  54. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  55. package/dest/mem_pools/instrumentation.js +56 -41
  56. package/dest/mem_pools/interface.d.ts +3 -4
  57. package/dest/mem_pools/interface.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +75 -16
  59. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
  61. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  62. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  64. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  65. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  67. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  68. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  70. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  71. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  74. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  76. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  77. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  79. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  80. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  82. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  83. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool/index.js +0 -1
  85. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  86. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool/priority.js +7 -2
  88. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  89. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  90. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  91. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  94. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  99. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  100. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  101. package/dest/msg_validators/attestation_validator/index.js +1 -0
  102. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  103. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  104. package/dest/msg_validators/clock_tolerance.js +37 -0
  105. package/dest/msg_validators/index.d.ts +2 -2
  106. package/dest/msg_validators/index.d.ts.map +1 -1
  107. package/dest/msg_validators/index.js +1 -1
  108. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  109. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  111. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  112. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  114. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  115. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  116. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  117. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  118. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  119. package/dest/msg_validators/proposal_validator/index.js +3 -0
  120. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  121. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  123. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  124. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  125. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  126. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  127. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  129. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  130. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  131. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  134. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  135. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  137. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  138. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/data_validator.js +60 -87
  140. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -4
  141. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  143. package/dest/msg_validators/tx_validator/factory.d.ts +21 -0
  144. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/factory.js +84 -0
  146. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  147. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  149. package/dest/msg_validators/tx_validator/gas_validator.d.ts +12 -0
  150. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/gas_validator.js +110 -0
  152. package/dest/msg_validators/tx_validator/index.d.ts +9 -1
  153. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/index.js +8 -0
  155. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  156. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  158. package/dest/msg_validators/tx_validator/phases_validator.d.ts +15 -0
  159. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  161. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  162. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  164. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  165. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  167. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +14 -0
  168. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  169. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  170. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  171. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  173. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  174. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -7
  176. package/dest/services/data_store.d.ts +1 -1
  177. package/dest/services/data_store.d.ts.map +1 -1
  178. package/dest/services/data_store.js +10 -6
  179. package/dest/services/discv5/discV5_service.d.ts +10 -9
  180. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  181. package/dest/services/discv5/discV5_service.js +64 -37
  182. package/dest/services/dummy_service.d.ts +66 -11
  183. package/dest/services/dummy_service.d.ts.map +1 -1
  184. package/dest/services/dummy_service.js +130 -5
  185. package/dest/services/encoding.d.ts +26 -7
  186. package/dest/services/encoding.d.ts.map +1 -1
  187. package/dest/services/encoding.js +75 -6
  188. package/dest/services/gossipsub/scoring.d.ts +1 -1
  189. package/dest/services/index.d.ts +5 -1
  190. package/dest/services/index.d.ts.map +1 -1
  191. package/dest/services/index.js +4 -0
  192. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  193. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  194. package/dest/services/libp2p/instrumentation.js +122 -0
  195. package/dest/services/libp2p/libp2p_service.d.ts +107 -95
  196. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  197. package/dest/services/libp2p/libp2p_service.js +1328 -313
  198. package/dest/services/peer-manager/interface.d.ts +23 -0
  199. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  200. package/dest/services/peer-manager/interface.js +1 -0
  201. package/dest/services/peer-manager/metrics.d.ts +12 -3
  202. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  203. package/dest/services/peer-manager/metrics.js +44 -12
  204. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  205. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  206. package/dest/services/peer-manager/peer_manager.js +551 -82
  207. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  208. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  209. package/dest/services/peer-manager/peer_scoring.js +43 -2
  210. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  211. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  212. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  213. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  214. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  215. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  216. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  217. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  218. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  219. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  220. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  221. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  222. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  223. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  224. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  225. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  226. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  227. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  228. package/dest/services/reqresp/config.d.ts +11 -9
  229. package/dest/services/reqresp/config.d.ts.map +1 -1
  230. package/dest/services/reqresp/config.js +18 -4
  231. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
  232. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  233. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
  234. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  235. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  236. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  237. package/dest/services/reqresp/constants.d.ts +12 -0
  238. package/dest/services/reqresp/constants.d.ts.map +1 -0
  239. package/dest/services/reqresp/constants.js +7 -0
  240. package/dest/services/reqresp/index.d.ts +3 -2
  241. package/dest/services/reqresp/index.d.ts.map +1 -1
  242. package/dest/services/reqresp/index.js +2 -1
  243. package/dest/services/reqresp/interface.d.ts +75 -24
  244. package/dest/services/reqresp/interface.d.ts.map +1 -1
  245. package/dest/services/reqresp/interface.js +46 -27
  246. package/dest/services/reqresp/metrics.d.ts +6 -5
  247. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  248. package/dest/services/reqresp/metrics.js +17 -21
  249. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  250. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  251. package/dest/services/reqresp/protocols/auth.js +71 -0
  252. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  253. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  254. package/dest/services/reqresp/protocols/block.js +30 -6
  255. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
  256. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  257. package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
  258. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  259. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  260. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +52 -0
  261. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +59 -0
  262. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  263. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +105 -0
  264. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  265. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  266. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  267. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  268. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  269. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  270. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  271. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  272. package/dest/services/reqresp/protocols/index.js +2 -0
  273. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  274. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  275. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  276. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/status.js +76 -5
  278. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  279. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  280. package/dest/services/reqresp/protocols/tx.js +34 -6
  281. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  282. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  283. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  284. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  285. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  286. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  287. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  288. package/dest/services/reqresp/reqresp.d.ts +29 -66
  289. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  290. package/dest/services/reqresp/reqresp.js +753 -248
  291. package/dest/services/reqresp/status.d.ts +10 -4
  292. package/dest/services/reqresp/status.d.ts.map +1 -1
  293. package/dest/services/reqresp/status.js +9 -2
  294. package/dest/services/service.d.ts +40 -20
  295. package/dest/services/service.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.d.ts +28 -0
  297. package/dest/services/tx_collection/config.d.ts.map +1 -0
  298. package/dest/services/tx_collection/config.js +66 -0
  299. package/dest/services/tx_collection/fast_tx_collection.d.ts +53 -0
  300. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  301. package/dest/services/tx_collection/fast_tx_collection.js +311 -0
  302. package/dest/services/tx_collection/index.d.ts +4 -0
  303. package/dest/services/tx_collection/index.d.ts.map +1 -0
  304. package/dest/services/tx_collection/index.js +3 -0
  305. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  306. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  307. package/dest/services/tx_collection/instrumentation.js +31 -0
  308. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  309. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  310. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  311. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  312. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  313. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  314. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  315. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  316. package/dest/services/tx_collection/tx_collection.js +128 -0
  317. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  318. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  319. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  320. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  321. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  322. package/dest/services/tx_collection/tx_source.js +31 -0
  323. package/dest/services/tx_provider.d.ts +51 -0
  324. package/dest/services/tx_provider.d.ts.map +1 -0
  325. package/dest/services/tx_provider.js +219 -0
  326. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  327. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  328. package/dest/services/tx_provider_instrumentation.js +34 -0
  329. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  330. package/dest/test-helpers/get-ports.d.ts +1 -1
  331. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  332. package/dest/test-helpers/index.d.ts +4 -1
  333. package/dest/test-helpers/index.d.ts.map +1 -1
  334. package/dest/test-helpers/index.js +3 -0
  335. package/dest/test-helpers/make-enrs.d.ts +1 -1
  336. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  337. package/dest/test-helpers/make-enrs.js +4 -5
  338. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  339. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  340. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  341. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  342. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  343. package/dest/test-helpers/mock-pubsub.js +130 -0
  344. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  345. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  346. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  347. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  348. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  349. package/dest/test-helpers/reqresp-nodes.js +62 -28
  350. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  351. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  352. package/dest/test-helpers/test_tx_provider.js +41 -0
  353. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  354. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  355. package/dest/test-helpers/testbench-utils.js +297 -0
  356. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  357. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  358. package/dest/testbench/p2p_client_testbench_worker.js +259 -90
  359. package/dest/testbench/parse_log_file.d.ts +1 -1
  360. package/dest/testbench/parse_log_file.js +4 -4
  361. package/dest/testbench/testbench.d.ts +1 -1
  362. package/dest/testbench/testbench.js +4 -4
  363. package/dest/testbench/worker_client_manager.d.ts +51 -11
  364. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  365. package/dest/testbench/worker_client_manager.js +232 -53
  366. package/dest/types/index.d.ts +4 -2
  367. package/dest/types/index.d.ts.map +1 -1
  368. package/dest/types/index.js +2 -0
  369. package/dest/util.d.ts +24 -16
  370. package/dest/util.d.ts.map +1 -1
  371. package/dest/util.js +75 -69
  372. package/dest/versioning.d.ts +4 -4
  373. package/dest/versioning.d.ts.map +1 -1
  374. package/dest/versioning.js +8 -3
  375. package/package.json +32 -27
  376. package/src/bootstrap/bootstrap.ts +34 -15
  377. package/src/client/factory.ts +135 -53
  378. package/src/client/index.ts +1 -0
  379. package/src/client/interface.ts +213 -0
  380. package/src/client/p2p_client.ts +476 -383
  381. package/src/client/test/tx_proposal_collector/README.md +227 -0
  382. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  383. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  384. package/src/config.ts +304 -134
  385. package/src/enr/generate-enr.ts +39 -6
  386. package/src/errors/attestation-pool.error.ts +13 -0
  387. package/src/index.ts +4 -0
  388. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  389. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +352 -201
  390. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  391. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  392. package/src/mem_pools/attestation_pool/mocks.ts +24 -17
  393. package/src/mem_pools/instrumentation.ts +72 -48
  394. package/src/mem_pools/interface.ts +2 -4
  395. package/src/mem_pools/tx_pool/README.md +270 -0
  396. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
  397. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  398. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  399. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  400. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  401. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  402. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  403. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  404. package/src/mem_pools/tx_pool/index.ts +0 -1
  405. package/src/mem_pools/tx_pool/priority.ts +9 -2
  406. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  407. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  408. package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
  409. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  410. package/src/msg_validators/attestation_validator/index.ts +1 -0
  411. package/src/msg_validators/clock_tolerance.ts +51 -0
  412. package/src/msg_validators/index.ts +1 -1
  413. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  414. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  415. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  416. package/src/msg_validators/proposal_validator/index.ts +3 -0
  417. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  418. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  419. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  420. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  421. package/src/msg_validators/tx_validator/block_header_validator.ts +10 -9
  422. package/src/msg_validators/tx_validator/data_validator.ts +95 -71
  423. package/src/msg_validators/tx_validator/double_spend_validator.ts +23 -20
  424. package/src/msg_validators/tx_validator/factory.ts +151 -0
  425. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  426. package/src/msg_validators/tx_validator/gas_validator.ts +123 -0
  427. package/src/msg_validators/tx_validator/index.ts +8 -0
  428. package/src/msg_validators/tx_validator/metadata_validator.ts +72 -24
  429. package/src/msg_validators/tx_validator/phases_validator.ts +118 -0
  430. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  431. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  432. package/src/msg_validators/tx_validator/timestamp_validator.ts +52 -0
  433. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  434. package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
  435. package/src/services/data_store.ts +10 -7
  436. package/src/services/discv5/discV5_service.ts +85 -39
  437. package/src/services/dummy_service.ts +198 -9
  438. package/src/services/encoding.ts +82 -6
  439. package/src/services/index.ts +4 -0
  440. package/src/services/libp2p/instrumentation.ts +126 -0
  441. package/src/services/libp2p/libp2p_service.ts +1170 -353
  442. package/src/services/peer-manager/interface.ts +29 -0
  443. package/src/services/peer-manager/metrics.ts +55 -12
  444. package/src/services/peer-manager/peer_manager.ts +657 -80
  445. package/src/services/peer-manager/peer_scoring.ts +45 -3
  446. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  447. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  448. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  449. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  450. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  451. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  452. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  453. package/src/services/reqresp/config.ts +26 -9
  454. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
  455. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  456. package/src/services/reqresp/constants.ts +14 -0
  457. package/src/services/reqresp/index.ts +2 -0
  458. package/src/services/reqresp/interface.ts +95 -37
  459. package/src/services/reqresp/metrics.ts +40 -28
  460. package/src/services/reqresp/protocols/auth.ts +83 -0
  461. package/src/services/reqresp/protocols/block.ts +26 -4
  462. package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
  463. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +67 -0
  464. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +121 -0
  465. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  466. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  467. package/src/services/reqresp/protocols/index.ts +2 -0
  468. package/src/services/reqresp/protocols/status.ts +121 -5
  469. package/src/services/reqresp/protocols/tx.ts +36 -8
  470. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  471. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  472. package/src/services/reqresp/reqresp.ts +449 -271
  473. package/src/services/reqresp/status.ts +12 -3
  474. package/src/services/service.ts +65 -22
  475. package/src/services/tx_collection/config.ts +98 -0
  476. package/src/services/tx_collection/fast_tx_collection.ts +364 -0
  477. package/src/services/tx_collection/index.ts +7 -0
  478. package/src/services/tx_collection/instrumentation.ts +35 -0
  479. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  480. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  481. package/src/services/tx_collection/tx_collection.ts +216 -0
  482. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  483. package/src/services/tx_collection/tx_source.ts +37 -0
  484. package/src/services/tx_provider.ts +232 -0
  485. package/src/services/tx_provider_instrumentation.ts +54 -0
  486. package/src/test-helpers/index.ts +3 -0
  487. package/src/test-helpers/make-enrs.ts +4 -5
  488. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  489. package/src/test-helpers/mock-pubsub.ts +188 -0
  490. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  491. package/src/test-helpers/reqresp-nodes.ts +87 -36
  492. package/src/test-helpers/test_tx_provider.ts +64 -0
  493. package/src/test-helpers/testbench-utils.ts +374 -0
  494. package/src/testbench/p2p_client_testbench_worker.ts +434 -89
  495. package/src/testbench/parse_log_file.ts +4 -4
  496. package/src/testbench/testbench.ts +4 -4
  497. package/src/testbench/worker_client_manager.ts +315 -59
  498. package/src/types/index.ts +2 -0
  499. package/src/util.ts +105 -91
  500. package/src/versioning.ts +11 -4
  501. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  502. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  503. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  504. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  505. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  506. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  507. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  508. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  509. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  510. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  511. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  512. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -16,10 +16,12 @@ import { createLogger } from '@aztec/foundation/log';
16
16
  logger;
17
17
  batch;
18
18
  requestsPerPeer;
19
- constructor(connectionSampler, batchSize, maxPeers){
19
+ /** Tracks peer-index combinations that returned empty/invalid responses */ failedPeerIndices;
20
+ constructor(connectionSampler, batchSize, maxPeers, exclude, logger = createLogger('p2p:reqresp:batch-connection-sampler')){
20
21
  this.connectionSampler = connectionSampler;
21
- this.logger = createLogger('p2p:reqresp:batch-connection-sampler');
22
+ this.logger = logger;
22
23
  this.batch = [];
24
+ this.failedPeerIndices = new Map();
23
25
  if (maxPeers <= 0) {
24
26
  throw new Error('Max peers cannot be 0');
25
27
  }
@@ -29,20 +31,81 @@ import { createLogger } from '@aztec/foundation/log';
29
31
  // Calculate how many requests each peer should handle, cannot be 0
30
32
  this.requestsPerPeer = Math.max(1, Math.floor(batchSize / maxPeers));
31
33
  // Sample initial peers
32
- this.batch = this.connectionSampler.samplePeersBatch(maxPeers);
34
+ const excluding = exclude && new Map(exclude.map((peerId)=>[
35
+ peerId.toString(),
36
+ true
37
+ ]));
38
+ this.batch = this.connectionSampler.samplePeersBatch(maxPeers, excluding);
33
39
  }
34
40
  /**
35
- * Gets the peer responsible for handling a specific request index
41
+ * Gets the peer responsible for handling a specific request index.
42
+ * If the primary peer has previously failed for this index, tries other peers.
43
+ * If all batch peers have failed, attempts to sample a new peer.
36
44
  *
37
45
  * @param index - The request index
38
- * @returns The peer assigned to handle this request
46
+ * @returns The peer assigned to handle this request, or undefined if no peer available
39
47
  */ getPeerForRequest(index) {
40
48
  if (this.batch.length === 0) {
41
49
  return undefined;
42
50
  }
43
51
  // Calculate which peer bucket this index belongs to
44
- const peerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
45
- return this.batch[peerIndex];
52
+ const primaryPeerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
53
+ // Try peers starting from primary, wrapping around
54
+ for(let offset = 0; offset < this.batch.length; offset++){
55
+ const peerIndex = (primaryPeerIndex + offset) % this.batch.length;
56
+ const peer = this.batch[peerIndex];
57
+ const peerKey = peer.toString();
58
+ const failedIndices = this.failedPeerIndices.get(peerKey);
59
+ if (!failedIndices || !failedIndices.has(index)) {
60
+ return peer;
61
+ }
62
+ }
63
+ // All batch peers have failed for this index - try to sample a new peer
64
+ const newPeer = this.sampleNewPeer();
65
+ if (newPeer) {
66
+ return newPeer;
67
+ }
68
+ return undefined;
69
+ }
70
+ /**
71
+ * Attempts to sample a new peer that isn't already in the batch.
72
+ * If successful, adds the peer to the batch.
73
+ *
74
+ * @returns The new peer if one was sampled, undefined otherwise
75
+ */ sampleNewPeer() {
76
+ // Exclude all current batch peers
77
+ const excluding = new Map(this.batch.map((p)=>[
78
+ p.toString(),
79
+ true
80
+ ]));
81
+ const newPeer = this.connectionSampler.getPeer(excluding);
82
+ if (newPeer) {
83
+ this.batch.push(newPeer);
84
+ this.logger.trace('Sampled new peer for exhausted index', {
85
+ newPeer: newPeer.toString()
86
+ });
87
+ return newPeer;
88
+ }
89
+ return undefined;
90
+ }
91
+ /**
92
+ * Marks that a peer returned an empty/invalid response for a specific request index.
93
+ * The peer will not be assigned this index again.
94
+ *
95
+ * @param peerId - The peer that failed
96
+ * @param index - The request index that failed
97
+ */ markPeerFailedForIndex(peerId, index) {
98
+ const peerKey = peerId.toString();
99
+ let failedIndices = this.failedPeerIndices.get(peerKey);
100
+ if (!failedIndices) {
101
+ failedIndices = new Set();
102
+ this.failedPeerIndices.set(peerKey, failedIndices);
103
+ }
104
+ failedIndices.add(index);
105
+ this.logger.trace('Marked peer failed for index', {
106
+ peerId: peerKey,
107
+ index
108
+ });
46
109
  }
47
110
  /**
48
111
  * Removes a peer and replaces it with a new one, maintaining the same position
@@ -60,17 +123,17 @@ import { createLogger } from '@aztec/foundation/log';
60
123
  true
61
124
  ]
62
125
  ]);
63
- const newPeer = this.connectionSampler.getPeer(excluding);
126
+ const newPeer = this.connectionSampler.getPeer(excluding); // Q: Shouldn't we accumulate all excluded peers? Otherwise the sampler could return us a previously excluded peer?
64
127
  if (newPeer) {
65
128
  this.batch[index] = newPeer;
66
- this.logger.trace(`Replaced peer ${peerId} with ${newPeer}`, {
129
+ this.logger.trace('Replaced peer', {
67
130
  peerId,
68
131
  newPeer
69
132
  });
70
133
  } else {
71
134
  // If we couldn't get a replacement, remove the peer and compact the array
72
135
  this.batch.splice(index, 1);
73
- this.logger.trace(`Removed peer ${peerId}`, {
136
+ this.logger.trace('Removed peer', {
74
137
  peerId
75
138
  });
76
139
  }
@@ -3,7 +3,7 @@ export declare class RandomSampler {
3
3
  random(max: number): number;
4
4
  }
5
5
  /**
6
- * A class that samples peers from the libp2p node and returns a peer that we don't already have a connection open to.
6
+ * A class that samples peers from the libp2p node and returns a peer that we don't already have a reqresp connection open to.
7
7
  * If we already have a connection open, we try to sample a different peer.
8
8
  * We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
9
9
  *
@@ -11,16 +11,17 @@ export declare class RandomSampler {
11
11
  */
12
12
  export declare class ConnectionSampler {
13
13
  private readonly libp2p;
14
- private readonly cleanupIntervalMs;
15
14
  private readonly sampler;
16
15
  private readonly logger;
16
+ private readonly opts;
17
17
  private cleanupInterval;
18
- private abortController;
19
- private readonly activeConnectionsCount;
20
- private readonly streams;
21
- private dialQueue;
22
- constructor(libp2p: Libp2p, cleanupIntervalMs?: number, // Default to 1 minute
23
- sampler?: RandomSampler);
18
+ protected readonly activeConnectionsCount: Map<string, number>;
19
+ protected readonly streams: Set<Stream>;
20
+ private abortOnStop;
21
+ constructor(libp2p: Libp2p, sampler: RandomSampler, logger?: import("@aztec/foundation/log").Logger, opts?: {
22
+ cleanupIntervalMs?: number;
23
+ p2pOptimisticNegotiation?: boolean;
24
+ });
24
25
  /**
25
26
  * Stops the cleanup job and closes all active connections
26
27
  */
@@ -32,30 +33,44 @@ export declare class ConnectionSampler {
32
33
  * @returns
33
34
  */
34
35
  getPeer(excluding?: Map<string, boolean>): PeerId | undefined;
36
+ /**
37
+ * Samples a peer from a list of peers, excluding those that have active (reqresp) connections or are in the exclusion list
38
+ *
39
+ * @param peers - The list of peers to sample from
40
+ * @param excluding - The peers to exclude from the sampling
41
+ * @returns - A peer from the list, or undefined if no peers are available,
42
+ * - a boolean indicating if the peer has active connections, and
43
+ * - all sampled peers - to enable optional resampling
44
+ *
45
+ * @dev The provided list peers, should be mutated by this function. This allows batch sampling
46
+ * to be performed without making extra copies of the list.
47
+ */
48
+ getPeerFromList(peers: PeerId[], excluding?: Map<string, boolean>): {
49
+ peer: PeerId | undefined;
50
+ sampledPeers: PeerId[];
51
+ };
52
+ getPeerListSortedByConnectionCountAsc(excluding?: Set<string>): PeerId[];
35
53
  /**
36
54
  * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
37
55
  *
38
56
  * @param numberToSample - The number of peers to sample
57
+ * @param excluding - The peers to exclude from the sampling
39
58
  * @returns Array of unique sampled peers, prioritizing those without active connections
40
59
  */
41
- samplePeersBatch(numberToSample: number): PeerId[];
60
+ samplePeersBatch(numberToSample: number, excluding?: Map<string, boolean>): PeerId[];
42
61
  /**
43
62
  * Dials a protocol and returns the stream
44
63
  *
45
64
  * @param peerId - The peer id
46
65
  * @param protocol - The protocol
66
+ * @param timeout - Abort connection if it takes too long
47
67
  * @returns The stream
48
68
  */
49
- dialProtocol(peerId: PeerId, protocol: string): Promise<Stream>;
69
+ dialProtocol(peerId: PeerId, protocol: string, timeout?: number): Promise<Stream>;
50
70
  /**
51
71
  * Closes a stream and updates the active connections count
52
- *
53
- * @param streamId - The stream id
54
- */
55
- close(streamId: string): Promise<void>;
56
- /**
57
- * Cleans up stale connections that we have lost accounting for
58
72
  */
73
+ close(stream: Stream): Promise<void>;
59
74
  private cleanupStaleConnections;
60
75
  }
61
- //# sourceMappingURL=connection_sampler.d.ts.map
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbl9zYW1wbGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25uZWN0aW9uLXNhbXBsZXIvY29ubmVjdGlvbl9zYW1wbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJaEUscUJBQWEsYUFBYTtJQUN4QixNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sVUFFakI7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILHFCQUFhLGlCQUFpQjtJQVkxQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFkdkIsT0FBTyxDQUFDLGVBQWUsQ0FBaUI7SUFHeEMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFhO0lBRzNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBYTtJQUVwRCxPQUFPLENBQUMsV0FBVyxDQUEwQztJQUU3RCxZQUNtQixNQUFNLEVBQUUsTUFBTSxFQUNkLE9BQU8sRUFBRSxhQUFhLEVBQ3RCLE1BQU0seUNBQWlELEVBQ3ZELElBQUksR0FBRTtRQUFFLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQUMsd0JBQXdCLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBTyxFQU0vRjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFTVDtJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FLNUQ7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGVBQWUsQ0FDYixLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQ2YsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDL0I7UUFDRCxJQUFJLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN6QixZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEIsQ0FxQ0E7SUFTTSxxQ0FBcUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBTzlFO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQXNDbkY7SUFJRDs7Ozs7OztPQU9HO0lBQ0csWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQXFCdEY7SUFFRDs7T0FFRztJQUNHLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FpQ3pDO1lBS2EsdUJBQXVCO0NBdUJ0QyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/connection_sampler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAShE,qBAAa,aAAa;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAA0C;IAEjE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAGnE,OAAO,CAAC,SAAS,CAAkC;gBAGhC,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAc,EAAE,sBAAsB;IACzD,OAAO,GAAE,aAAmC;IAO/D;;OAEG;IACG,IAAI;IAaV;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;IA+B7D;;;;;OAKG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAkClD;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBrE;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5C;;OAEG;YACW,uBAAuB;CAetC"}
1
+ {"version":3,"file":"connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/connection_sampler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhE,qBAAa,aAAa;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,UAEjB;CACF;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAdvB,OAAO,CAAC,eAAe,CAAiB;IAGxC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAG3E,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAEpD,OAAO,CAAC,WAAW,CAA0C;IAE7D,YACmB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,MAAM,yCAAiD,EACvD,IAAI,GAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,wBAAwB,CAAC,EAAE,OAAO,CAAA;KAAO,EAM/F;IAED;;OAEG;IACG,IAAI,kBAST;IAED;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAK5D;IAED;;;;;;;;;;;OAWG;IACH,eAAe,CACb,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B;QACD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAqCA;IASM,qCAAqC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAO9E;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAsCnF;IAID;;;;;;;OAOG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBtF;IAED;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCzC;YAKa,uBAAuB;CAuBtC"}
@@ -1,5 +1,5 @@
1
+ import { AbortError } from '@aztec/foundation/error';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
- import { SerialQueue } from '@aztec/foundation/queue';
3
3
  const MAX_SAMPLE_ATTEMPTS = 4;
4
4
  export class RandomSampler {
5
5
  random(max) {
@@ -7,43 +7,40 @@ export class RandomSampler {
7
7
  }
8
8
  }
9
9
  /**
10
- * A class that samples peers from the libp2p node and returns a peer that we don't already have a connection open to.
10
+ * A class that samples peers from the libp2p node and returns a peer that we don't already have a reqresp connection open to.
11
11
  * If we already have a connection open, we try to sample a different peer.
12
12
  * We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
13
13
  *
14
14
  * @dev Close must always be called on connections, else memory leak
15
15
  */ export class ConnectionSampler {
16
16
  libp2p;
17
- cleanupIntervalMs;
18
17
  sampler;
19
18
  logger;
19
+ opts;
20
20
  cleanupInterval;
21
- abortController;
21
+ // Map from stringified peer id to number of active connections
22
22
  activeConnectionsCount;
23
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
23
24
  streams;
24
- // Serial queue to ensure that we only dial one peer at a time
25
- dialQueue;
26
- constructor(libp2p, cleanupIntervalMs = 60000, sampler = new RandomSampler()){
25
+ abortOnStop;
26
+ constructor(libp2p, sampler, logger = createLogger('p2p:reqresp:connection-sampler'), opts = {}){
27
27
  this.libp2p = libp2p;
28
- this.cleanupIntervalMs = cleanupIntervalMs;
29
28
  this.sampler = sampler;
30
- this.logger = createLogger('p2p:reqresp:connection-sampler');
31
- this.abortController = new AbortController();
29
+ this.logger = logger;
30
+ this.opts = opts;
32
31
  this.activeConnectionsCount = new Map();
33
- this.streams = new Map();
34
- this.dialQueue = new SerialQueue();
35
- this.cleanupInterval = setInterval(()=>void this.cleanupStaleConnections(), this.cleanupIntervalMs);
36
- this.dialQueue.start();
32
+ this.streams = new Set();
33
+ this.abortOnStop = new AbortController();
34
+ this.cleanupInterval = setInterval(()=>void this.cleanupStaleConnections(), this.opts.cleanupIntervalMs ?? 60_000);
37
35
  }
38
36
  /**
39
37
  * Stops the cleanup job and closes all active connections
40
38
  */ async stop() {
41
39
  this.logger.info('Stopping connection sampler');
40
+ this.abortOnStop.abort(new AbortError('Connection sampler stopped'));
42
41
  clearInterval(this.cleanupInterval);
43
- this.abortController.abort();
44
- await this.dialQueue.end();
45
42
  // Close all active streams
46
- const closePromises = Array.from(this.streams.keys()).map((streamId)=>this.close(streamId));
43
+ const closePromises = Array.from(this.streams.values()).map((stream)=>this.close(stream));
47
44
  await Promise.all(closePromises);
48
45
  this.logger.info('Connection sampler stopped');
49
46
  }
@@ -55,56 +52,114 @@ export class RandomSampler {
55
52
  */ getPeer(excluding) {
56
53
  // In libp2p getPeers performs a shallow copy, so this array can be sliced from safetly
57
54
  const peers = this.libp2p.getPeers();
55
+ const { peer } = this.getPeerFromList(peers, excluding);
56
+ return peer;
57
+ }
58
+ /**
59
+ * Samples a peer from a list of peers, excluding those that have active (reqresp) connections or are in the exclusion list
60
+ *
61
+ * @param peers - The list of peers to sample from
62
+ * @param excluding - The peers to exclude from the sampling
63
+ * @returns - A peer from the list, or undefined if no peers are available,
64
+ * - a boolean indicating if the peer has active connections, and
65
+ * - all sampled peers - to enable optional resampling
66
+ *
67
+ * @dev The provided list peers, should be mutated by this function. This allows batch sampling
68
+ * to be performed without making extra copies of the list.
69
+ */ getPeerFromList(peers, excluding) {
58
70
  if (peers.length === 0) {
59
- return undefined;
71
+ return {
72
+ peer: undefined,
73
+ sampledPeers: []
74
+ };
60
75
  }
61
- let randomIndex = this.sampler.random(peers.length);
62
- let attempts = 0;
63
- // Keep sampling while:
64
- // - we haven't exceeded max attempts AND
65
- // - either the peer has active connections OR is in the exclusion list
66
- while(attempts < MAX_SAMPLE_ATTEMPTS && ((this.activeConnectionsCount.get(peers[randomIndex]) ?? 0) > 0 || (excluding?.get(peers[randomIndex]?.toString()) ?? false))){
76
+ const sampledPeers = [];
77
+ // Try to find a peer that has no active connections and is not in the exclusion list
78
+ for(let attempts = 0; attempts < MAX_SAMPLE_ATTEMPTS && peers.length > 0; attempts++){
79
+ const randomIndex = this.sampler.random(peers.length);
80
+ const peer = peers[randomIndex];
81
+ const hasActiveConnections = (this.activeConnectionsCount.get(peer.toString()) ?? 0) > 0;
82
+ const isExcluded = excluding?.get(peer.toString()) ?? false;
83
+ // Remove this peer from consideration
67
84
  peers.splice(randomIndex, 1);
68
- randomIndex = this.sampler.random(peers.length);
69
- attempts++;
85
+ // If peer is suitable (no active connections and not excluded), return it
86
+ if (!hasActiveConnections && !isExcluded) {
87
+ this.logger.trace('Sampled peer', {
88
+ attempts,
89
+ peer
90
+ });
91
+ return {
92
+ peer,
93
+ sampledPeers
94
+ };
95
+ }
96
+ // Keep track of peers that have active reqresp channels, batch sampling will use these to resample
97
+ sampledPeers.push(peer);
70
98
  }
71
- this.logger.trace(`Sampled peer in ${attempts} attempts`, {
72
- attempts,
73
- peer: peers[randomIndex]?.toString()
99
+ // If we've exhausted our attempts or peers list is empty, return the last peer if available
100
+ const lastPeer = peers.length > 0 ? peers[this.sampler.random(peers.length)] : undefined;
101
+ this.logger.trace('Sampled peer', {
102
+ attempts: MAX_SAMPLE_ATTEMPTS,
103
+ peer: lastPeer?.toString()
74
104
  });
75
- return peers[randomIndex];
105
+ return {
106
+ peer: lastPeer,
107
+ sampledPeers
108
+ };
109
+ }
110
+ /*
111
+ * Returns all peers sorted by connection count ascending,
112
+ * meaning that the peers with the least number of active connections are earlier in an array
113
+ *
114
+ * @param: excluding - peers to exclude
115
+ * @return: list of peer ids
116
+ * */ getPeerListSortedByConnectionCountAsc(excluding) {
117
+ return this.libp2p.getPeers().filter((id)=>!excluding?.has(id.toString())).map((id)=>({
118
+ id,
119
+ count: this.activeConnectionsCount.get(id.toString()) ?? 0
120
+ })).sort((a, b)=>a.count - b.count).map((p)=>p.id);
76
121
  }
77
122
  /**
78
123
  * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
79
124
  *
80
125
  * @param numberToSample - The number of peers to sample
126
+ * @param excluding - The peers to exclude from the sampling
81
127
  * @returns Array of unique sampled peers, prioritizing those without active connections
82
- */ samplePeersBatch(numberToSample) {
128
+ */ samplePeersBatch(numberToSample, excluding) {
83
129
  const peers = this.libp2p.getPeers();
84
- const sampledPeers = [];
85
- const peersWithConnections = []; // Hold onto peers with active connections incase we need to sample more
86
- for (const peer of peers){
87
- const activeConnections = this.activeConnectionsCount.get(peer) ?? 0;
88
- if (activeConnections === 0) {
89
- if (sampledPeers.push(peer) === numberToSample) {
90
- return sampledPeers;
91
- }
92
- } else {
93
- peersWithConnections.push(peer);
130
+ this.logger.debug('Sampling peers batch', {
131
+ numberToSample,
132
+ peers
133
+ });
134
+ // Only sample as many peers as we have available
135
+ numberToSample = Math.min(numberToSample, peers.length);
136
+ const batch = [];
137
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
138
+ const withActiveConnections = new Set();
139
+ for(let i = 0; i < numberToSample; i++){
140
+ const { peer, sampledPeers } = this.getPeerFromList(peers, excluding);
141
+ if (peer) {
142
+ batch.push(peer);
143
+ }
144
+ if (sampledPeers.length > 0) {
145
+ sampledPeers.forEach((peer)=>withActiveConnections.add(peer));
94
146
  }
95
147
  }
148
+ const lengthWithoutConnections = batch.length;
96
149
  // If we still need more peers, sample from those with connections
97
- while(sampledPeers.length < numberToSample && peersWithConnections.length > 0){
98
- const randomIndex = this.sampler.random(peersWithConnections.length);
99
- const [peer] = peersWithConnections.splice(randomIndex, 1);
100
- sampledPeers.push(peer);
150
+ while(batch.length < numberToSample && withActiveConnections.size > 0){
151
+ const randomIndex = this.sampler.random(withActiveConnections.size);
152
+ const peer = Array.from(withActiveConnections)[randomIndex];
153
+ withActiveConnections.delete(peer);
154
+ batch.push(peer);
101
155
  }
102
- this.logger.trace(`Batch sampled ${sampledPeers.length} unique peers`, {
103
- peers: sampledPeers,
104
- withoutConnections: sampledPeers.length - peersWithConnections.length,
105
- withConnections: peersWithConnections.length
156
+ this.logger.trace('Batch sampled peers', {
157
+ length: batch.length,
158
+ peers: batch,
159
+ withoutConnections: lengthWithoutConnections,
160
+ withConnections: numberToSample - lengthWithoutConnections
106
161
  });
107
- return sampledPeers;
162
+ return batch;
108
163
  }
109
164
  // Set of passthrough functions to keep track of active connections
110
165
  /**
@@ -112,51 +167,60 @@ export class RandomSampler {
112
167
  *
113
168
  * @param peerId - The peer id
114
169
  * @param protocol - The protocol
170
+ * @param timeout - Abort connection if it takes too long
115
171
  * @returns The stream
116
- */ async dialProtocol(peerId, protocol) {
117
- // Dialling at the same time can cause race conditions where two different streams
118
- // end up with the same id, hence a serial queue
119
- const stream = await this.dialQueue.put(()=>this.libp2p.dialProtocol(peerId, protocol, {
120
- signal: this.abortController.signal
121
- }));
122
- this.streams.set(stream.id, {
123
- stream,
124
- peerId
172
+ */ async dialProtocol(peerId, protocol, timeout) {
173
+ const stream = await this.libp2p.dialProtocol(peerId, protocol, {
174
+ signal: AbortSignal.any(timeout ? [
175
+ this.abortOnStop.signal,
176
+ AbortSignal.timeout(timeout)
177
+ ] : [
178
+ this.abortOnStop.signal
179
+ ]),
180
+ negotiateFully: !this.opts.p2pOptimisticNegotiation
125
181
  });
126
- const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 0) + 1;
127
- this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
128
- this.logger.trace(`Dialed protocol ${protocol} with peer ${peerId.toString()}`, {
182
+ stream.metadata.peerId = peerId;
183
+ this.streams.add(stream);
184
+ const peerIdString = peerId.toString();
185
+ const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerIdString) ?? 0) + 1;
186
+ this.activeConnectionsCount.set(peerIdString, updatedActiveConnectionsCount);
187
+ this.logger.trace('Dialed protocol', {
129
188
  streamId: stream.id,
130
- peerId: peerId.toString(),
189
+ protocol,
190
+ peerId: peerIdString,
131
191
  activeConnectionsCount: updatedActiveConnectionsCount
132
192
  });
133
193
  return stream;
134
194
  }
135
195
  /**
136
196
  * Closes a stream and updates the active connections count
137
- *
138
- * @param streamId - The stream id
139
- */ async close(streamId) {
197
+ */ async close(stream) {
198
+ let peerId = undefined;
140
199
  try {
141
- const streamAndPeerId = this.streams.get(streamId);
142
- if (!streamAndPeerId) {
143
- this.logger.warn(`Stream ${streamId} not found`);
144
- return;
200
+ peerId = stream.metadata.peerId;
201
+ let updatedActiveConnectionsCount = undefined;
202
+ if (!peerId) {
203
+ this.logger.warn(`Stream ${stream.id} does not have a peerId set`);
204
+ } else {
205
+ updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId.toString()) ?? 1) - 1;
206
+ this.activeConnectionsCount.set(peerId.toString(), updatedActiveConnectionsCount);
145
207
  }
146
- const { stream, peerId } = streamAndPeerId;
147
- const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 1) - 1;
148
- this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
149
- this.logger.trace(`Closing connection to peer ${peerId.toString()}`, {
150
- streamId,
151
- peerId: peerId.toString(),
208
+ this.logger.trace('Closing connection', {
209
+ streamId: stream.id,
210
+ peerId: peerId?.toString(),
152
211
  protocol: stream.protocol,
153
212
  activeConnectionsCount: updatedActiveConnectionsCount
154
213
  });
155
- await stream?.close();
214
+ if (!this.streams.has(stream)) {
215
+ this.logger.debug(`Stream ${stream.id} is not in the active streams set`);
216
+ }
217
+ await stream.close();
156
218
  } catch (error) {
157
- this.logger.error(`Failed to close connection to peer with stream id ${streamId}`, error);
219
+ this.logger.error(`Failed to close connection to peer ${peerId ?? 'unknown'} with stream id ${stream.id}`, error);
220
+ // graceful close failed, abort the stream
221
+ stream.abort(new AbortError('Failed to close stream gracefully'));
158
222
  } finally{
159
- this.streams.delete(streamId);
223
+ this.streams.delete(stream);
160
224
  }
161
225
  }
162
226
  /**
@@ -164,15 +228,21 @@ export class RandomSampler {
164
228
  */ async cleanupStaleConnections() {
165
229
  // Look for streams without anything in the activeConnectionsCount
166
230
  // If we find anything, close the stream
167
- for (const [streamId, { peerId }] of this.streams.entries()){
231
+ for (const stream of this.streams.values()){
168
232
  try {
169
233
  // Check if we have lost track of accounting
170
- if (this.activeConnectionsCount.get(peerId) === 0) {
171
- await this.close(streamId);
172
- this.logger.debug(`Cleaned up stale connection ${streamId} to peer ${peerId.toString()}`);
234
+ const peerId = stream.metadata.peerId;
235
+ if (!peerId) {
236
+ this.logger.warn(`Stream ${stream.id} does not have a peerId set`);
237
+ } else if (this.activeConnectionsCount.get(peerId.toString()) === 0) {
238
+ await this.close(stream);
239
+ this.logger.debug('Cleaned up stale connection', {
240
+ streamId: stream.id,
241
+ peerId: peerId.toString()
242
+ });
173
243
  }
174
244
  } catch (error) {
175
- this.logger.error(`Error cleaning up stale connection ${streamId}`, {
245
+ this.logger.error(`Error cleaning up stale connection to peer ${stream.metadata.peerId?.toString() ?? 'unknown'} stream ${stream.id}`, {
176
246
  error
177
247
  });
178
248
  }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Constants for P2P message deserialization bounds checking.
3
+ * These constants define maximum allowed sizes during deserialization
4
+ * to prevent DoS attacks via maliciously crafted messages.
5
+ */
6
+ /** Max transactions per block for deserialization validation (~300x default of 32) */
7
+ export { MAX_TXS_PER_BLOCK } from '@aztec/stdlib/deserialization';
8
+ /** Max version string length (e.g., "1.0.0-alpha.123") */
9
+ export declare const MAX_VERSION_STRING_LENGTH = 64;
10
+ /** Max block hash string length (hex: 0x + 64 chars, with generous headroom) */
11
+ export declare const MAX_BLOCK_HASH_STRING_LENGTH = 128;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILHNGQUFzRjtBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSwwREFBMEQ7QUFDMUQsZUFBTyxNQUFNLHlCQUF5QixLQUFLLENBQUM7QUFFNUMsZ0ZBQWdGO0FBQ2hGLGVBQU8sTUFBTSw0QkFBNEIsTUFBTSxDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sFAAsF;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,0DAA0D;AAC1D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,gFAAgF;AAChF,eAAO,MAAM,4BAA4B,MAAM,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Constants for P2P message deserialization bounds checking.
3
+ * These constants define maximum allowed sizes during deserialization
4
+ * to prevent DoS attacks via maliciously crafted messages.
5
+ */ /** Max transactions per block for deserialization validation (~300x default of 32) */ export { MAX_TXS_PER_BLOCK } from '@aztec/stdlib/deserialization';
6
+ /** Max version string length (e.g., "1.0.0-alpha.123") */ export const MAX_VERSION_STRING_LENGTH = 64;
7
+ /** Max block hash string length (hex: 0x + 64 chars, with generous headroom) */ export const MAX_BLOCK_HASH_STRING_LENGTH = 128;
@@ -1,6 +1,7 @@
1
- export {};
2
1
  /**
3
2
  * Request Response protocol allows nodes to ask their peers for data
4
3
  * that they missed via the traditional gossip protocol.
5
4
  */
6
- //# sourceMappingURL=index.d.ts.map
5
+ export * from './protocols/index.js';
6
+ export * from './interface.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxnQkFBZ0IsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/index.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  /**
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
+ */ export * from './protocols/index.js';
5
+ export * from './interface.js';