@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.001888fc

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 (659) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +26 -13
  5. package/dest/client/factory.d.ts +21 -11
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +101 -26
  8. package/dest/client/index.d.ts +2 -1
  9. package/dest/client/index.d.ts.map +1 -1
  10. package/dest/client/index.js +1 -0
  11. package/dest/client/interface.d.ts +183 -0
  12. package/dest/client/interface.d.ts.map +1 -0
  13. package/dest/client/interface.js +9 -0
  14. package/dest/client/p2p_client.d.ts +93 -221
  15. package/dest/client/p2p_client.d.ts.map +1 -1
  16. package/dest/client/p2p_client.js +760 -289
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  19. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
  20. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  21. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  22. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  23. package/dest/config.d.ts +192 -126
  24. package/dest/config.d.ts.map +1 -1
  25. package/dest/config.js +240 -36
  26. package/dest/enr/generate-enr.d.ts +11 -3
  27. package/dest/enr/generate-enr.d.ts.map +1 -1
  28. package/dest/enr/generate-enr.js +27 -5
  29. package/dest/enr/index.d.ts +1 -1
  30. package/dest/errors/attestation-pool.error.d.ts +7 -0
  31. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  32. package/dest/errors/attestation-pool.error.js +12 -0
  33. package/dest/errors/reqresp.error.d.ts +1 -1
  34. package/dest/errors/reqresp.error.d.ts.map +1 -1
  35. package/dest/errors/tx-pool.error.d.ts +8 -0
  36. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  37. package/dest/errors/tx-pool.error.js +9 -0
  38. package/dest/index.d.ts +5 -1
  39. package/dest/index.d.ts.map +1 -1
  40. package/dest/index.js +3 -0
  41. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +125 -30
  42. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  43. package/dest/mem_pools/attestation_pool/attestation_pool.js +445 -3
  44. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  45. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  46. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +564 -173
  47. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  48. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  49. package/dest/mem_pools/attestation_pool/index.js +1 -2
  50. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  51. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  52. package/dest/mem_pools/attestation_pool/mocks.js +19 -21
  53. package/dest/mem_pools/index.d.ts +3 -2
  54. package/dest/mem_pools/index.d.ts.map +1 -1
  55. package/dest/mem_pools/index.js +1 -1
  56. package/dest/mem_pools/instrumentation.d.ts +18 -12
  57. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  58. package/dest/mem_pools/instrumentation.js +58 -41
  59. package/dest/mem_pools/interface.d.ts +6 -7
  60. package/dest/mem_pools/interface.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +75 -16
  62. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
  64. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  65. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  67. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  68. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  70. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  71. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +123 -0
  73. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  74. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  76. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  77. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  79. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  80. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  82. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  83. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  85. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  86. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool/index.js +0 -1
  88. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  89. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  90. package/dest/mem_pools/tx_pool/priority.js +8 -3
  91. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  92. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  93. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  94. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  95. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +279 -46
  96. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  97. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  99. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  100. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  102. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  103. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  109. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  111. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  112. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  114. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  115. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  116. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  117. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  118. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  119. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  120. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  121. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  122. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  123. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  124. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  125. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  126. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  127. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  128. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  129. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  130. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  131. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  132. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  133. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  134. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  135. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  136. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  137. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  138. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  139. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  140. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  141. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +215 -0
  142. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  143. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  144. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +134 -0
  145. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  146. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +216 -0
  147. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  148. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  149. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  150. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  151. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  152. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  153. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  154. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  155. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  156. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  157. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  158. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +923 -0
  159. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  160. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  161. package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
  162. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  163. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  164. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  165. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  166. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  167. package/dest/msg_validators/attestation_validator/index.js +1 -0
  168. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  169. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  170. package/dest/msg_validators/clock_tolerance.js +37 -0
  171. package/dest/msg_validators/index.d.ts +2 -2
  172. package/dest/msg_validators/index.d.ts.map +1 -1
  173. package/dest/msg_validators/index.js +1 -1
  174. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  175. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  176. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  177. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -0
  178. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  179. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  180. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -0
  181. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  182. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +20 -0
  183. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  184. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  185. package/dest/msg_validators/proposal_validator/index.js +3 -0
  186. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +18 -0
  187. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  188. package/dest/msg_validators/proposal_validator/proposal_validator.js +116 -0
  189. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  190. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  191. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  192. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
  193. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  194. package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
  195. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  196. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  197. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  198. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  199. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  200. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  201. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  202. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  203. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  204. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  205. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  206. package/dest/msg_validators/tx_validator/data_validator.js +60 -87
  207. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -6
  208. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  209. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  210. package/dest/msg_validators/tx_validator/factory.d.ts +148 -0
  211. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  212. package/dest/msg_validators/tx_validator/factory.js +265 -0
  213. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  214. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  215. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  216. package/dest/msg_validators/tx_validator/gas_validator.d.ts +76 -0
  217. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  218. package/dest/msg_validators/tx_validator/gas_validator.js +177 -0
  219. package/dest/msg_validators/tx_validator/index.d.ts +11 -1
  220. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  221. package/dest/msg_validators/tx_validator/index.js +10 -0
  222. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  223. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  224. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  225. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  226. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  227. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  228. package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
  229. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  230. package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
  231. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  232. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  233. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  234. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  235. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  236. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  237. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
  238. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  239. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  240. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  241. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  242. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  243. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  244. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  245. package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -7
  246. package/dest/services/data_store.d.ts +1 -1
  247. package/dest/services/data_store.d.ts.map +1 -1
  248. package/dest/services/data_store.js +10 -6
  249. package/dest/services/discv5/discV5_service.d.ts +10 -9
  250. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  251. package/dest/services/discv5/discV5_service.js +64 -37
  252. package/dest/services/dummy_service.d.ts +74 -11
  253. package/dest/services/dummy_service.d.ts.map +1 -1
  254. package/dest/services/dummy_service.js +136 -5
  255. package/dest/services/encoding.d.ts +26 -7
  256. package/dest/services/encoding.d.ts.map +1 -1
  257. package/dest/services/encoding.js +82 -12
  258. package/dest/services/gossipsub/index.d.ts +3 -0
  259. package/dest/services/gossipsub/index.d.ts.map +1 -0
  260. package/dest/services/gossipsub/index.js +2 -0
  261. package/dest/services/gossipsub/scoring.d.ts +21 -3
  262. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  263. package/dest/services/gossipsub/scoring.js +24 -7
  264. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  265. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  266. package/dest/services/gossipsub/topic_score_params.js +346 -0
  267. package/dest/services/index.d.ts +6 -1
  268. package/dest/services/index.d.ts.map +1 -1
  269. package/dest/services/index.js +5 -0
  270. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  271. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  272. package/dest/services/libp2p/instrumentation.js +122 -0
  273. package/dest/services/libp2p/libp2p_service.d.ts +165 -101
  274. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  275. package/dest/services/libp2p/libp2p_service.js +1478 -350
  276. package/dest/services/peer-manager/interface.d.ts +23 -0
  277. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  278. package/dest/services/peer-manager/interface.js +1 -0
  279. package/dest/services/peer-manager/metrics.d.ts +14 -3
  280. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  281. package/dest/services/peer-manager/metrics.js +50 -12
  282. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  283. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  284. package/dest/services/peer-manager/peer_manager.js +552 -82
  285. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  286. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  287. package/dest/services/peer-manager/peer_scoring.js +68 -4
  288. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +54 -0
  289. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  290. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +556 -0
  291. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  292. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  293. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  294. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +48 -0
  295. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  296. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  297. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  298. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  299. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  300. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  301. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  302. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  303. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  304. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  305. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  306. package/dest/services/reqresp/config.d.ts +11 -9
  307. package/dest/services/reqresp/config.d.ts.map +1 -1
  308. package/dest/services/reqresp/config.js +18 -4
  309. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
  310. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  311. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
  312. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  313. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  314. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  315. package/dest/services/reqresp/constants.d.ts +12 -0
  316. package/dest/services/reqresp/constants.d.ts.map +1 -0
  317. package/dest/services/reqresp/constants.js +7 -0
  318. package/dest/services/reqresp/index.d.ts +3 -2
  319. package/dest/services/reqresp/index.d.ts.map +1 -1
  320. package/dest/services/reqresp/index.js +2 -1
  321. package/dest/services/reqresp/interface.d.ts +84 -24
  322. package/dest/services/reqresp/interface.d.ts.map +1 -1
  323. package/dest/services/reqresp/interface.js +60 -27
  324. package/dest/services/reqresp/metrics.d.ts +6 -5
  325. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  326. package/dest/services/reqresp/metrics.js +17 -21
  327. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  328. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  329. package/dest/services/reqresp/protocols/auth.js +71 -0
  330. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  331. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  332. package/dest/services/reqresp/protocols/block.js +30 -6
  333. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
  334. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  335. package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
  336. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
  337. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  338. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +57 -0
  339. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +70 -0
  340. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  341. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +121 -0
  342. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  343. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  344. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  345. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  346. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  347. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  348. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  349. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  350. package/dest/services/reqresp/protocols/index.js +2 -0
  351. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  352. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  353. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  354. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  355. package/dest/services/reqresp/protocols/status.js +76 -5
  356. package/dest/services/reqresp/protocols/tx.d.ts +20 -4
  357. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  358. package/dest/services/reqresp/protocols/tx.js +54 -6
  359. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  360. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  361. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  362. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  363. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  364. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  365. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  366. package/dest/services/reqresp/reqresp.d.ts +29 -66
  367. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  368. package/dest/services/reqresp/reqresp.js +762 -249
  369. package/dest/services/reqresp/status.d.ts +10 -4
  370. package/dest/services/reqresp/status.d.ts.map +1 -1
  371. package/dest/services/reqresp/status.js +9 -2
  372. package/dest/services/service.d.ts +76 -20
  373. package/dest/services/service.d.ts.map +1 -1
  374. package/dest/services/tx_collection/config.d.ts +46 -0
  375. package/dest/services/tx_collection/config.d.ts.map +1 -0
  376. package/dest/services/tx_collection/config.js +112 -0
  377. package/dest/services/tx_collection/fast_tx_collection.d.ts +54 -0
  378. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  379. package/dest/services/tx_collection/fast_tx_collection.js +327 -0
  380. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  381. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  382. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  383. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  384. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  385. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  386. package/dest/services/tx_collection/index.d.ts +5 -0
  387. package/dest/services/tx_collection/index.d.ts.map +1 -0
  388. package/dest/services/tx_collection/index.js +4 -0
  389. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  390. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  391. package/dest/services/tx_collection/instrumentation.js +32 -0
  392. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  393. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  394. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  395. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  396. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  397. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  398. package/dest/services/tx_collection/slow_tx_collection.d.ts +57 -0
  399. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  400. package/dest/services/tx_collection/slow_tx_collection.js +211 -0
  401. package/dest/services/tx_collection/tx_collection.d.ts +123 -0
  402. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  403. package/dest/services/tx_collection/tx_collection.js +200 -0
  404. package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
  405. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  406. package/dest/services/tx_collection/tx_collection_sink.js +108 -0
  407. package/dest/services/tx_collection/tx_source.d.ts +23 -0
  408. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  409. package/dest/services/tx_collection/tx_source.js +48 -0
  410. package/dest/services/tx_file_store/config.d.ts +16 -0
  411. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  412. package/dest/services/tx_file_store/config.js +22 -0
  413. package/dest/services/tx_file_store/index.d.ts +4 -0
  414. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  415. package/dest/services/tx_file_store/index.js +3 -0
  416. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  417. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  418. package/dest/services/tx_file_store/instrumentation.js +29 -0
  419. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  420. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  421. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  422. package/dest/services/tx_provider.d.ts +51 -0
  423. package/dest/services/tx_provider.d.ts.map +1 -0
  424. package/dest/services/tx_provider.js +220 -0
  425. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  426. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  427. package/dest/services/tx_provider_instrumentation.js +34 -0
  428. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  429. package/dest/test-helpers/get-ports.d.ts +1 -1
  430. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  431. package/dest/test-helpers/index.d.ts +4 -1
  432. package/dest/test-helpers/index.d.ts.map +1 -1
  433. package/dest/test-helpers/index.js +3 -0
  434. package/dest/test-helpers/make-enrs.d.ts +1 -1
  435. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  436. package/dest/test-helpers/make-enrs.js +4 -5
  437. package/dest/test-helpers/make-test-p2p-clients.d.ts +35 -8
  438. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  439. package/dest/test-helpers/make-test-p2p-clients.js +86 -17
  440. package/dest/test-helpers/mock-pubsub.d.ts +85 -0
  441. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  442. package/dest/test-helpers/mock-pubsub.js +231 -0
  443. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  444. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  445. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  446. package/dest/test-helpers/reqresp-nodes.d.ts +15 -12
  447. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  448. package/dest/test-helpers/reqresp-nodes.js +63 -28
  449. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  450. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  451. package/dest/test-helpers/test_tx_provider.js +41 -0
  452. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  453. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  454. package/dest/test-helpers/testbench-utils.js +367 -0
  455. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  456. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  457. package/dest/testbench/p2p_client_testbench_worker.js +261 -91
  458. package/dest/testbench/parse_log_file.d.ts +1 -1
  459. package/dest/testbench/parse_log_file.js +4 -4
  460. package/dest/testbench/testbench.d.ts +1 -1
  461. package/dest/testbench/testbench.js +4 -4
  462. package/dest/testbench/worker_client_manager.d.ts +53 -11
  463. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  464. package/dest/testbench/worker_client_manager.js +237 -54
  465. package/dest/types/index.d.ts +4 -2
  466. package/dest/types/index.d.ts.map +1 -1
  467. package/dest/types/index.js +2 -0
  468. package/dest/util.d.ts +25 -17
  469. package/dest/util.d.ts.map +1 -1
  470. package/dest/util.js +75 -69
  471. package/dest/versioning.d.ts +4 -4
  472. package/dest/versioning.d.ts.map +1 -1
  473. package/dest/versioning.js +8 -3
  474. package/package.json +32 -27
  475. package/src/bootstrap/bootstrap.ts +34 -15
  476. package/src/client/factory.ts +215 -58
  477. package/src/client/index.ts +1 -0
  478. package/src/client/interface.ts +235 -0
  479. package/src/client/p2p_client.ts +474 -457
  480. package/src/client/test/tx_proposal_collector/README.md +227 -0
  481. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
  482. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  483. package/src/config.ts +409 -135
  484. package/src/enr/generate-enr.ts +39 -6
  485. package/src/errors/attestation-pool.error.ts +13 -0
  486. package/src/errors/tx-pool.error.ts +12 -0
  487. package/src/index.ts +5 -0
  488. package/src/mem_pools/attestation_pool/attestation_pool.ts +530 -29
  489. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +692 -201
  490. package/src/mem_pools/attestation_pool/index.ts +9 -2
  491. package/src/mem_pools/attestation_pool/mocks.ts +25 -17
  492. package/src/mem_pools/index.ts +4 -1
  493. package/src/mem_pools/instrumentation.ts +75 -47
  494. package/src/mem_pools/interface.ts +5 -7
  495. package/src/mem_pools/tx_pool/README.md +270 -0
  496. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
  497. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  498. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  499. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +163 -0
  500. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  501. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  502. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  503. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  504. package/src/mem_pools/tx_pool/index.ts +0 -1
  505. package/src/mem_pools/tx_pool/priority.ts +10 -3
  506. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  507. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +228 -37
  508. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  509. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  510. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  511. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  512. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  513. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  514. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  515. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  516. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  517. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  518. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  519. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  520. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  521. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  522. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  523. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  524. package/src/mem_pools/tx_pool_v2/interfaces.ts +247 -0
  525. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +337 -0
  526. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  527. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  528. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  529. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1105 -0
  530. package/src/msg_validators/attestation_validator/README.md +49 -0
  531. package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
  532. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  533. package/src/msg_validators/attestation_validator/index.ts +1 -0
  534. package/src/msg_validators/clock_tolerance.ts +51 -0
  535. package/src/msg_validators/index.ts +1 -1
  536. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  537. package/src/msg_validators/proposal_validator/README.md +123 -0
  538. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +20 -0
  539. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -0
  540. package/src/msg_validators/proposal_validator/index.ts +3 -0
  541. package/src/msg_validators/proposal_validator/proposal_validator.ts +115 -0
  542. package/src/msg_validators/tx_validator/README.md +119 -0
  543. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  544. package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
  545. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  546. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  547. package/src/msg_validators/tx_validator/block_header_validator.ts +23 -10
  548. package/src/msg_validators/tx_validator/data_validator.ts +95 -71
  549. package/src/msg_validators/tx_validator/double_spend_validator.ts +31 -23
  550. package/src/msg_validators/tx_validator/factory.ts +460 -0
  551. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  552. package/src/msg_validators/tx_validator/gas_validator.ts +219 -0
  553. package/src/msg_validators/tx_validator/index.ts +10 -0
  554. package/src/msg_validators/tx_validator/metadata_validator.ts +80 -24
  555. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  556. package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
  557. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  558. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  559. package/src/msg_validators/tx_validator/timestamp_validator.ts +57 -0
  560. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  561. package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
  562. package/src/services/data_store.ts +10 -7
  563. package/src/services/discv5/discV5_service.ts +85 -39
  564. package/src/services/dummy_service.ts +210 -9
  565. package/src/services/encoding.ts +87 -11
  566. package/src/services/gossipsub/README.md +641 -0
  567. package/src/services/gossipsub/index.ts +2 -0
  568. package/src/services/gossipsub/scoring.ts +29 -5
  569. package/src/services/gossipsub/topic_score_params.ts +487 -0
  570. package/src/services/index.ts +5 -0
  571. package/src/services/libp2p/instrumentation.ts +126 -0
  572. package/src/services/libp2p/libp2p_service.ts +1335 -402
  573. package/src/services/peer-manager/interface.ts +29 -0
  574. package/src/services/peer-manager/metrics.ts +62 -12
  575. package/src/services/peer-manager/peer_manager.ts +658 -80
  576. package/src/services/peer-manager/peer_scoring.ts +70 -3
  577. package/src/services/reqresp/README.md +229 -0
  578. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  579. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +698 -0
  580. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  581. package/src/services/reqresp/batch-tx-requester/interface.ts +55 -0
  582. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  583. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  584. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  585. package/src/services/reqresp/config.ts +26 -9
  586. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
  587. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  588. package/src/services/reqresp/constants.ts +14 -0
  589. package/src/services/reqresp/index.ts +2 -0
  590. package/src/services/reqresp/interface.ts +120 -37
  591. package/src/services/reqresp/metrics.ts +40 -28
  592. package/src/services/reqresp/protocols/auth.ts +83 -0
  593. package/src/services/reqresp/protocols/block.ts +26 -4
  594. package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
  595. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +76 -0
  596. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +144 -0
  597. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  598. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  599. package/src/services/reqresp/protocols/index.ts +2 -0
  600. package/src/services/reqresp/protocols/status.ts +121 -5
  601. package/src/services/reqresp/protocols/tx.ts +58 -8
  602. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  603. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  604. package/src/services/reqresp/reqresp.ts +462 -272
  605. package/src/services/reqresp/status.ts +12 -3
  606. package/src/services/service.ts +114 -22
  607. package/src/services/tx_collection/config.ts +166 -0
  608. package/src/services/tx_collection/fast_tx_collection.ts +387 -0
  609. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  610. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  611. package/src/services/tx_collection/index.ts +8 -0
  612. package/src/services/tx_collection/instrumentation.ts +41 -0
  613. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  614. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  615. package/src/services/tx_collection/slow_tx_collection.ts +266 -0
  616. package/src/services/tx_collection/tx_collection.ts +313 -0
  617. package/src/services/tx_collection/tx_collection_sink.ts +125 -0
  618. package/src/services/tx_collection/tx_source.ts +56 -0
  619. package/src/services/tx_file_store/config.ts +37 -0
  620. package/src/services/tx_file_store/index.ts +3 -0
  621. package/src/services/tx_file_store/instrumentation.ts +36 -0
  622. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  623. package/src/services/tx_provider.ts +233 -0
  624. package/src/services/tx_provider_instrumentation.ts +54 -0
  625. package/src/test-helpers/index.ts +3 -0
  626. package/src/test-helpers/make-enrs.ts +4 -5
  627. package/src/test-helpers/make-test-p2p-clients.ts +114 -26
  628. package/src/test-helpers/mock-pubsub.ts +325 -0
  629. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  630. package/src/test-helpers/reqresp-nodes.ts +91 -42
  631. package/src/test-helpers/test_tx_provider.ts +64 -0
  632. package/src/test-helpers/testbench-utils.ts +431 -0
  633. package/src/testbench/p2p_client_testbench_worker.ts +442 -93
  634. package/src/testbench/parse_log_file.ts +4 -4
  635. package/src/testbench/testbench.ts +4 -4
  636. package/src/testbench/worker_client_manager.ts +323 -59
  637. package/src/types/index.ts +2 -0
  638. package/src/util.ts +112 -92
  639. package/src/versioning.ts +11 -4
  640. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
  641. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  642. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -112
  643. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
  644. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  645. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -129
  646. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  647. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  648. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  649. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  650. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  651. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  652. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  653. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  654. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  655. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -159
  656. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -161
  657. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  658. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  659. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,12 +1,14 @@
1
1
  // @attribution: lodestar impl for inspiration
2
- import { type Logger, createLogger } from '@aztec/foundation/log';
2
+ import { compactArray } from '@aztec/foundation/collection';
3
+ import { AbortError, TimeoutError } from '@aztec/foundation/error';
4
+ import { createLogger } from '@aztec/foundation/log';
3
5
  import { executeTimeout } from '@aztec/foundation/timer';
4
6
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
7
  import { Attributes, type TelemetryClient, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
6
8
 
7
9
  import type { IncomingStreamData, PeerId, Stream } from '@libp2p/interface';
8
- import { pipe } from 'it-pipe';
9
10
  import type { Libp2p } from 'libp2p';
11
+ import { pipeline } from 'node:stream/promises';
10
12
  import type { Uint8ArrayList } from 'uint8arraylist';
11
13
 
12
14
  import {
@@ -16,18 +18,25 @@ import {
16
18
  } from '../../errors/reqresp.error.js';
17
19
  import { SnappyTransform } from '../encoding.js';
18
20
  import type { PeerScoring } from '../peer-manager/peer_scoring.js';
19
- import type { P2PReqRespConfig } from './config.js';
21
+ import {
22
+ DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
23
+ DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
24
+ type P2PReqRespConfig,
25
+ } from './config.js';
20
26
  import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
21
- import { ConnectionSampler } from './connection-sampler/connection_sampler.js';
27
+ import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
22
28
  import {
23
- DEFAULT_SUB_PROTOCOL_HANDLERS,
24
29
  DEFAULT_SUB_PROTOCOL_VALIDATORS,
30
+ type ReqRespInterface,
25
31
  type ReqRespResponse,
26
32
  ReqRespSubProtocol,
33
+ type ReqRespSubProtocolHandler,
27
34
  type ReqRespSubProtocolHandlers,
35
+ type ReqRespSubProtocolRateLimits,
28
36
  type ReqRespSubProtocolValidators,
29
37
  type SubProtocolMap,
30
- subProtocolMap,
38
+ responseFromBuffer,
39
+ subProtocolSizeCalculators,
31
40
  } from './interface.js';
32
41
  import { ReqRespMetrics } from './metrics.js';
33
42
  import {
@@ -51,15 +60,12 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
51
60
  *
52
61
  * see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
53
62
  */
54
- export class ReqResp {
55
- protected readonly logger: Logger;
56
-
57
- private overallRequestTimeoutMs: number;
58
- private individualRequestTimeoutMs: number;
63
+ export class ReqResp implements ReqRespInterface {
64
+ private individualRequestTimeoutMs: number = DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS;
65
+ private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
59
66
 
60
- // Warning, if the `start` function is not called as the parent class constructor, then the default sub protocol handlers will be used ( not good )
61
- private subProtocolHandlers: ReqRespSubProtocolHandlers = DEFAULT_SUB_PROTOCOL_HANDLERS;
62
- private subProtocolValidators: ReqRespSubProtocolValidators = DEFAULT_SUB_PROTOCOL_VALIDATORS;
67
+ private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
68
+ private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
63
69
 
64
70
  private connectionSampler: ConnectionSampler;
65
71
  private rateLimiter: RequestResponseRateLimiter;
@@ -72,35 +78,57 @@ export class ReqResp {
72
78
  config: P2PReqRespConfig,
73
79
  private libp2p: Libp2p,
74
80
  private peerScoring: PeerScoring,
81
+ private logger = createLogger('p2p:reqresp'),
82
+ rateLimits: Partial<ReqRespSubProtocolRateLimits> = {},
75
83
  telemetryClient: TelemetryClient = getTelemetryClient(),
76
84
  ) {
77
- this.logger = createLogger('p2p:reqresp');
85
+ this.updateConfig(config);
78
86
 
79
- this.overallRequestTimeoutMs = config.overallRequestTimeoutMs;
80
- this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
81
-
82
- this.rateLimiter = new RequestResponseRateLimiter(peerScoring);
87
+ this.rateLimiter = new RequestResponseRateLimiter(peerScoring, rateLimits);
83
88
 
84
89
  // Connection sampler is used to sample our connected peers
85
- this.connectionSampler = new ConnectionSampler(libp2p);
90
+ this.connectionSampler = new ConnectionSampler(
91
+ libp2p,
92
+ new RandomSampler(),
93
+ createLogger(`${logger.module}:connection-sampler`),
94
+ config,
95
+ );
86
96
 
87
97
  this.snappyTransform = new SnappyTransform();
88
98
  this.metrics = new ReqRespMetrics(telemetryClient);
89
99
  }
90
100
 
101
+ public updateConfig(config: Partial<P2PReqRespConfig>): void {
102
+ if (typeof config.individualRequestTimeoutMs === 'number') {
103
+ this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
104
+ }
105
+
106
+ if (typeof config.dialTimeoutMs === 'number') {
107
+ this.dialTimeoutMs = config.dialTimeoutMs;
108
+ }
109
+ }
110
+
91
111
  get tracer() {
92
112
  return this.metrics.tracer;
93
113
  }
94
114
 
115
+ /**
116
+ * Get the connection sampler instance
117
+ */
118
+ getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'> {
119
+ return this.connectionSampler;
120
+ }
121
+
95
122
  /**
96
123
  * Start the reqresp service
97
124
  */
98
125
  async start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators) {
99
- this.subProtocolHandlers = subProtocolHandlers;
100
- this.subProtocolValidators = subProtocolValidators;
126
+ Object.assign(this.subProtocolHandlers, subProtocolHandlers);
127
+ Object.assign(this.subProtocolValidators, subProtocolValidators);
101
128
 
102
129
  // Register all protocol handlers
103
- for (const subProtocol of Object.keys(this.subProtocolHandlers)) {
130
+ for (const subProtocol of Object.keys(subProtocolHandlers)) {
131
+ this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
104
132
  await this.libp2p.handle(
105
133
  subProtocol,
106
134
  (data: IncomingStreamData) =>
@@ -112,6 +140,23 @@ export class ReqResp {
112
140
  this.rateLimiter.start();
113
141
  }
114
142
 
143
+ async addSubProtocol(
144
+ subProtocol: ReqRespSubProtocol,
145
+ handler: ReqRespSubProtocolHandler,
146
+ validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
147
+ ): Promise<void> {
148
+ this.subProtocolHandlers[subProtocol] = handler;
149
+ this.subProtocolValidators[subProtocol] = validator;
150
+ this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
151
+ await this.libp2p.handle(
152
+ subProtocol,
153
+ (data: IncomingStreamData) =>
154
+ void this.streamHandler(subProtocol as ReqRespSubProtocol, data).catch(err =>
155
+ this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err),
156
+ ),
157
+ );
158
+ }
159
+
115
160
  /**
116
161
  * Stop the reqresp service
117
162
  */
@@ -135,100 +180,6 @@ export class ReqResp {
135
180
  // NOTE: We assume libp2p instance is managed by the caller
136
181
  }
137
182
 
138
- /**
139
- * Send a request to peers, returns the first response
140
- *
141
- * @param subProtocol - The protocol being requested
142
- * @param request - The request to send
143
- * @returns - The response from the peer, otherwise undefined
144
- *
145
- * @description
146
- * This method attempts to send a request to all active peers using the specified sub-protocol.
147
- * It opens a stream with each peer, sends the request, and awaits a response.
148
- * If a valid response is received, it returns the response; otherwise, it continues to the next peer.
149
- * If no response is received from any peer, it returns undefined.
150
- *
151
- * The method performs the following steps:
152
- * - Sample a peer to send the request to.
153
- * - Opens a stream with the peer using the specified sub-protocol.
154
- *
155
- * When a response is received, it is validated using the given sub protocols response validator.
156
- * To see the interface for the response validator - see `interface.ts`
157
- *
158
- * Failing a response validation requests in a severe peer penalty, and will
159
- * prompt the node to continue to search to the next peer.
160
- * For example, a transaction request validator will check that the payload returned does in fact
161
- * match the txHash that was requested. A peer that fails this check an only be an extremely naughty peer.
162
- *
163
- * This entire operation is wrapped in an overall timeout, that is independent of the
164
- * peer it is requesting data from.
165
- *
166
- */
167
- async sendRequest<SubProtocol extends ReqRespSubProtocol>(
168
- subProtocol: SubProtocol,
169
- request: InstanceType<SubProtocolMap[SubProtocol]['request']>,
170
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
171
- const responseValidator = this.subProtocolValidators[subProtocol];
172
- const requestBuffer = request.toBuffer();
173
-
174
- const requestFunction = async () => {
175
- // Attempt to ask all of our peers, but sampled in a random order
176
- // This function is wrapped in a timeout, so we will exit the loop if we have not received a response
177
- const numberOfPeers = this.libp2p.getPeers().length;
178
-
179
- if (numberOfPeers === 0) {
180
- this.logger.debug('No active peers to send requests to');
181
- return undefined;
182
- }
183
-
184
- const attemptedPeers: Map<string, boolean> = new Map();
185
- for (let i = 0; i < numberOfPeers; i++) {
186
- // Sample a peer to make a request to
187
- const peer = this.connectionSampler.getPeer(attemptedPeers);
188
- this.logger.trace(`Attempting to send request to peer: ${peer?.toString()}`);
189
- if (!peer) {
190
- this.logger.debug('No peers available to send requests to');
191
- return undefined;
192
- }
193
-
194
- attemptedPeers.set(peer.toString(), true);
195
-
196
- this.logger.trace(`Sending request to peer: ${peer.toString()}`);
197
- const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffer);
198
-
199
- if (response && response.status !== ReqRespStatus.SUCCESS) {
200
- this.logger.debug(
201
- `Request to peer ${peer.toString()} failed with status ${prettyPrintReqRespStatus(response.status)}`,
202
- );
203
- continue;
204
- }
205
-
206
- // If we get a response, return it, otherwise we iterate onto the next peer
207
- // We do not consider it a success if we have an empty buffer
208
- if (response && response.data.length > 0) {
209
- const object = subProtocolMap[subProtocol].response.fromBuffer(response.data);
210
- // The response validator handles peer punishment within
211
- const isValid = await responseValidator(request, object, peer);
212
- if (!isValid) {
213
- throw new InvalidResponseError();
214
- }
215
- return object;
216
- }
217
- }
218
- };
219
-
220
- try {
221
- return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>(
222
- requestFunction,
223
- this.overallRequestTimeoutMs,
224
- () => new CollectiveReqRespTimeoutError(),
225
- );
226
- } catch (e: any) {
227
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
228
- return undefined;
229
- }
230
- }
231
-
232
183
  /**
233
184
  * Request multiple messages over the same sub protocol, balancing the requests across peers.
234
185
  *
@@ -261,23 +212,38 @@ export class ReqResp {
261
212
  async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
262
213
  subProtocol: SubProtocol,
263
214
  requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
215
+ pinnedPeer: PeerId | undefined,
264
216
  timeoutMs = 10000,
265
- maxPeers = Math.min(10, requests.length),
217
+ maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
266
218
  maxRetryAttempts = 3,
267
219
  ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
268
- const responseValidator = this.subProtocolValidators[subProtocol];
220
+ const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
269
221
  const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
270
222
  const requestBuffers = requests.map(req => req.toBuffer());
223
+ const isEmptyResponse = (value: unknown): boolean => {
224
+ // Some responses serialize to a non-empty buffer even when they contain no items (e.g., empty TxArray).
225
+ if (!value || typeof value !== 'object') {
226
+ return false;
227
+ }
228
+ const length = (value as { length?: number }).length;
229
+ return typeof length === 'number' && length === 0;
230
+ };
271
231
 
272
- const requestFunction = async () => {
232
+ const requestFunction = async (signal: AbortSignal) => {
273
233
  // Track which requests still need to be processed
274
234
  const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
275
235
 
276
236
  // Create batch sampler with the total number of requests and max peers
277
- const batchSampler = new BatchConnectionSampler(this.connectionSampler, requests.length, maxPeers);
237
+ const batchSampler = new BatchConnectionSampler(
238
+ this.connectionSampler,
239
+ requests.length,
240
+ maxPeers,
241
+ compactArray([pinnedPeer]), // Exclude pinned peer from sampling, we will forcefully send all requests to it
242
+ createLogger(`${this.logger.module}:batch-connection-sampler`),
243
+ );
278
244
 
279
- if (batchSampler.activePeerCount === 0) {
280
- this.logger.debug('No active peers to send requests to');
245
+ if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
246
+ this.logger.warn('No active peers to send requests to');
281
247
  return [];
282
248
  }
283
249
 
@@ -291,20 +257,42 @@ export class ReqResp {
291
257
 
292
258
  let retryAttempts = 0;
293
259
  while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
260
+ if (signal.aborted) {
261
+ throw new AbortError('Batch request aborted');
262
+ }
294
263
  // Process requests in parallel for each available peer
295
- const requestBatches = new Map<PeerId, number[]>();
264
+ type BatchEntry = { peerId: PeerId; indices: number[] };
265
+ const requestBatches = new Map<string, BatchEntry>();
296
266
 
297
267
  // Group requests by peer
298
268
  for (const requestIndex of pendingRequestIndices) {
299
269
  const peer = batchSampler.getPeerForRequest(requestIndex);
300
270
  if (!peer) {
301
- break;
271
+ // No peer available for this specific index (all peers exhausted for it)
272
+ // Skip this index for now - it stays in pendingRequestIndices for retry
273
+ continue;
302
274
  }
303
-
304
- if (!requestBatches.has(peer)) {
305
- requestBatches.set(peer, []);
275
+ const peerAsString = peer.toString();
276
+ if (!requestBatches.has(peerAsString)) {
277
+ requestBatches.set(peerAsString, { peerId: peer, indices: [] });
306
278
  }
307
- requestBatches.get(peer)!.push(requestIndex);
279
+ requestBatches.get(peerAsString)!.indices.push(requestIndex);
280
+ }
281
+
282
+ // If there is a pinned peer, we will always send every request to that peer
283
+ // We use the default limits for the subprotocol to avoid hitting the rate limiter
284
+ if (pinnedPeer) {
285
+ const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
286
+ requestBatches.set(pinnedPeer.toString(), {
287
+ peerId: pinnedPeer,
288
+ indices: Array.from(pendingRequestIndices.values()).slice(0, limit),
289
+ });
290
+ }
291
+
292
+ // If no requests could be assigned (all peers exhausted for all indices), exit early
293
+ if (requestBatches.size === 0) {
294
+ this.logger.warn('No peers available for any pending request indices, stopping batch request');
295
+ break;
308
296
  }
309
297
 
310
298
  // Make parallel requests for each peer's batch
@@ -316,41 +304,63 @@ export class ReqResp {
316
304
  // while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
317
305
 
318
306
  const batchResults = await Promise.all(
319
- Array.from(requestBatches.entries()).map(async ([peer, indices]) => {
307
+ Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
320
308
  try {
309
+ const markIndexFailed = (index: number) => batchSampler.markPeerFailedForIndex(peer, index);
321
310
  // Requests all going to the same peer are sent synchronously
322
311
  const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
323
312
  [];
313
+ let shouldReplacePeer = false;
314
+ const handleFailure = (status: ReqRespStatus, index: number) => {
315
+ this.logger.warn(
316
+ `Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(status)}`,
317
+ );
318
+ markIndexFailed(index);
319
+ return status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
320
+ };
321
+
324
322
  for (const index of indices) {
323
+ this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
325
324
  const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
326
325
 
327
326
  // Check the status of the response buffer
328
- if (response && response.status !== ReqRespStatus.SUCCESS) {
329
- this.logger.debug(
330
- `Request to peer ${peer.toString()} failed with status ${prettyPrintReqRespStatus(
331
- response.status,
332
- )}`,
333
- );
334
-
335
- // If we hit a rate limit or some failure, we remove the peer and return the results,
336
- // they will be split among remaining peers and the new sampled peer
337
- batchSampler.removePeerAndReplace(peer);
338
- return { peer, results: peerResults };
327
+ if (response.status !== ReqRespStatus.SUCCESS) {
328
+ shouldReplacePeer = handleFailure(response.status, index);
329
+ if (shouldReplacePeer) {
330
+ break;
331
+ }
332
+ continue;
339
333
  }
340
334
 
341
- if (response && response.data.length > 0) {
342
- const object = subProtocolMap[subProtocol].response.fromBuffer(response.data);
343
- const isValid = await responseValidator(requests[index], object, peer);
335
+ if (response.data.length === 0) {
336
+ markIndexFailed(index);
337
+ continue;
338
+ }
344
339
 
345
- if (isValid) {
346
- peerResults.push({ index, response: object });
347
- }
340
+ const object = responseFromBuffer(subProtocol, response.data);
341
+ if (isEmptyResponse(object)) {
342
+ markIndexFailed(index);
343
+ continue;
344
+ }
345
+
346
+ const isValid = await responseValidator(requests[index], object, peer);
347
+ if (!isValid) {
348
+ markIndexFailed(index);
349
+ continue;
348
350
  }
351
+
352
+ peerResults.push({ index, response: object });
353
+ }
354
+
355
+ // If peer had a hard failure (rate limit), replace it for future iterations
356
+ if (shouldReplacePeer) {
357
+ this.logger.warn(`Peer ${peerAsString} hit a hard failure, removing from sampler`);
358
+ batchSampler.removePeerAndReplace(peer);
349
359
  }
350
360
 
351
361
  return { peer, results: peerResults };
352
362
  } catch (error) {
353
- this.logger.debug(`Failed batch request to peer ${peer.toString()}:`, error);
363
+ this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
354
364
  batchSampler.removePeerAndReplace(peer);
355
365
  return { peer, results: [] };
356
366
  }
@@ -371,7 +381,7 @@ export class ReqResp {
371
381
  }
372
382
 
373
383
  if (retryAttempts >= maxRetryAttempts) {
374
- this.logger.debug(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
384
+ this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
375
385
  }
376
386
 
377
387
  return responses;
@@ -384,7 +394,7 @@ export class ReqResp {
384
394
  () => new CollectiveReqRespTimeoutError(),
385
395
  );
386
396
  } catch (e: any) {
387
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
397
+ this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
388
398
  return [];
389
399
  }
390
400
  }
@@ -399,6 +409,7 @@ export class ReqResp {
399
409
  * @param peerId - The peer to send the request to
400
410
  * @param subProtocol - The protocol to use to request
401
411
  * @param payload - The payload to send
412
+ * @param dialTimeout - If establishing a stream takes longer than this an error will be thrown
402
413
  * @returns If the request is successful, the response is returned, otherwise undefined
403
414
  *
404
415
  * @description
@@ -421,29 +432,59 @@ export class ReqResp {
421
432
  peerId: PeerId,
422
433
  subProtocol: ReqRespSubProtocol,
423
434
  payload: Buffer,
424
- ): Promise<ReqRespResponse | undefined> {
435
+ dialTimeout: number = this.dialTimeoutMs,
436
+ ): Promise<ReqRespResponse> {
425
437
  let stream: Stream | undefined;
426
438
  try {
427
439
  this.metrics.recordRequestSent(subProtocol);
428
440
 
429
- stream = await this.connectionSampler.dialProtocol(peerId, subProtocol);
441
+ // Calculate expected response size based on the request payload
442
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
430
443
 
431
- // Open the stream with a timeout
432
- const result = await executeTimeout<ReqRespResponse>(
433
- (): Promise<ReqRespResponse> => pipe([payload], stream!, this.readMessage.bind(this)),
434
- this.individualRequestTimeoutMs,
435
- () => new IndividualReqRespTimeoutError(),
444
+ this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
445
+ stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
446
+ this.logger.trace(
447
+ `Opened stream ${stream.id} for sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
436
448
  );
437
449
 
438
- return result;
450
+ const timeoutErr = new IndividualReqRespTimeoutError();
451
+ // Create a wrapper to pass the expected size to readMessage
452
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
453
+ this.readMessage(source, expectedSizeKb);
454
+ const [_, resp] = await executeTimeout(
455
+ signal =>
456
+ Promise.all([
457
+ pipeline([payload], stream!.sink, { signal }),
458
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
459
+ ]),
460
+ this.individualRequestTimeoutMs,
461
+ () => timeoutErr,
462
+ );
463
+ return resp;
439
464
  } catch (e: any) {
465
+ this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
466
+ // On error we immediately abort the stream, this is preferred way,
467
+ // because it signals to the sender that error happened, whereas
468
+ // closing the stream only closes our side and is much slower
469
+ if (stream) {
470
+ stream!.abort(e);
471
+ }
472
+
440
473
  this.metrics.recordRequestError(subProtocol);
441
474
  this.handleResponseError(e, peerId, subProtocol);
475
+
476
+ // If there is an exception, we return an unknown response
477
+ this.logger.debug(`Error sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}: ${e}`);
478
+ return { status: ReqRespStatus.FAILURE };
442
479
  } finally {
443
480
  // Only close the stream if we created it
481
+ // Note even if we aborted the stream, calling close on it is ok, it's just a no-op
444
482
  if (stream) {
445
483
  try {
446
- await this.connectionSampler.close(stream.id);
484
+ this.logger.trace(
485
+ `Closing stream ${stream.id} for request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
486
+ );
487
+ await this.connectionSampler.close(stream);
447
488
  } catch (closeError) {
448
489
  this.logger.error(
449
490
  `Error closing stream: ${closeError instanceof Error ? closeError.message : 'Unknown error'}`,
@@ -464,93 +505,51 @@ export class ReqResp {
464
505
  * @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
465
506
  */
466
507
  private handleResponseError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
467
- const severity = this.categorizeError(e, peerId, subProtocol);
508
+ const severity = this.categorizeResponseError(e, peerId, subProtocol);
468
509
  if (severity) {
469
510
  this.peerScoring.penalizePeer(peerId, severity);
470
511
  }
471
512
  }
472
513
 
473
- /**
474
- * Categorize the error and log it.
475
- */
476
- private categorizeError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): PeerErrorSeverity | undefined {
477
- // Non punishable errors - we do not expect a response for goodbye messages
478
- if (subProtocol === ReqRespSubProtocol.GOODBYE) {
479
- this.logger.debug('Error encountered on goodbye sub protocol, no penalty', {
480
- peerId: peerId.toString(),
481
- subProtocol,
482
- });
483
- return undefined;
484
- }
485
-
486
- // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
487
- const logTags = {
488
- peerId: peerId.toString(),
489
- subProtocol,
490
- };
491
- if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
492
- this.logger.debug(
493
- `Non-punishable error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`,
494
- logTags,
495
- );
496
- return undefined;
497
- }
498
-
499
- // Pubishable errors
500
- // Connection reset errors in the networking stack are punished with high severity
501
- // it just signals an unreliable peer
502
- // We assume that the requesting node has a functioning networking stack.
503
- if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
504
- this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
505
- return PeerErrorSeverity.HighToleranceError;
506
- }
507
-
508
- if (e?.code === 'ECONNREFUSED') {
509
- this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
510
- return PeerErrorSeverity.HighToleranceError;
511
- }
512
-
513
- // Timeout errors are punished with high tolerance, they can be due to a geogrpahically far away peer or an
514
- // overloaded peer
515
- if (e instanceof IndividualReqRespTimeoutError) {
516
- this.logger.debug(
517
- `Timeout error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`,
518
- logTags,
519
- );
520
- return PeerErrorSeverity.HighToleranceError;
521
- }
522
-
523
- // Catch all error
524
- this.logger.error(`Unexpected error sending request to peer`, e, logTags);
525
- return PeerErrorSeverity.HighToleranceError;
526
- }
527
-
528
514
  /**
529
515
  * Read a message returned from a stream into a single buffer
530
516
  *
531
517
  * The message is split into two components
532
518
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
533
519
  * - The second chunk should contain the response data
520
+ *
521
+ * @param source - The async iterable source of data chunks
522
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
534
523
  */
535
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
536
- let statusBuffer: ReqRespStatus | undefined;
524
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
525
+ let status: ReqRespStatus | undefined;
537
526
  const chunks: Uint8Array[] = [];
538
527
 
539
528
  try {
540
529
  for await (const chunk of source) {
541
- if (statusBuffer === undefined) {
542
- const firstChunkBuffer = chunk.subarray();
543
- statusBuffer = parseStatusChunk(firstChunkBuffer);
544
- } else {
530
+ const statusParsed = status !== undefined;
531
+ if (statusParsed) {
545
532
  chunks.push(chunk.subarray());
533
+ continue;
534
+ }
535
+
536
+ const firstChunkBuffer = chunk.subarray();
537
+ status = parseStatusChunk(firstChunkBuffer);
538
+
539
+ // In case status is not SUCCESS, we do not expect any data in the response
540
+ // we can return early
541
+ if (status !== ReqRespStatus.SUCCESS) {
542
+ return {
543
+ status,
544
+ };
546
545
  }
547
546
  }
548
547
 
549
548
  const messageData = Buffer.concat(chunks);
550
- const message: Buffer = this.snappyTransform.inboundTransformNoTopic(messageData);
549
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
551
550
 
552
551
  return {
553
- status: statusBuffer ?? ReqRespStatus.UNKNOWN,
552
+ status: status ?? ReqRespStatus.UNKNOWN,
554
553
  data: message,
555
554
  };
556
555
  } catch (e: any) {
@@ -563,7 +562,6 @@ export class ReqResp {
563
562
 
564
563
  return {
565
564
  status,
566
- data: Buffer.from([]),
567
565
  };
568
566
  }
569
567
  }
@@ -572,7 +570,8 @@ export class ReqResp {
572
570
  * Stream Handler
573
571
  * Reads the incoming stream, determines the protocol, then triggers the appropriate handler
574
572
  *
575
- * @param param0 - The incoming stream data
573
+ * @param protocol - The sub protocol to handle
574
+ * @param incomingStream - The incoming stream data containing the stream and connection
576
575
  *
577
576
  * @description
578
577
  * An individual stream handler will be bound to each sub protocol, and handles returning data back
@@ -588,14 +587,13 @@ export class ReqResp {
588
587
  [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
589
588
  [Attributes.P2P_ID]: connection.remotePeer.toString(),
590
589
  }))
591
- private async streamHandler(protocol: ReqRespSubProtocol, { stream, connection }: IncomingStreamData) {
592
- this.metrics.recordRequestReceived(protocol);
593
-
590
+ private async streamHandler(protocol: ReqRespSubProtocol, incomingStream: IncomingStreamData) {
591
+ const { stream, connection } = incomingStream;
594
592
  try {
595
- // Store a reference to from this for the async generator
593
+ this.metrics.recordRequestReceived(protocol);
596
594
  const rateLimitStatus = this.rateLimiter.allow(protocol, connection.remotePeer);
597
- if (rateLimitStatus != RateLimitStatus.Allowed) {
598
- this.logger.warn(
595
+ if (rateLimitStatus !== RateLimitStatus.Allowed) {
596
+ this.logger.verbose(
599
597
  `Rate limit exceeded ${prettyPrintRateLimitStatus(rateLimitStatus)} for ${protocol} from ${
600
598
  connection.remotePeer
601
599
  }`,
@@ -604,58 +602,250 @@ export class ReqResp {
604
602
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
605
603
  }
606
604
 
607
- const handler = this.subProtocolHandlers[protocol];
608
- const transform = this.snappyTransform;
605
+ await this.processStream(protocol, incomingStream);
606
+ } catch (err: any) {
607
+ this.metrics.recordResponseError(protocol);
608
+ this.handleRequestError(err, connection.remotePeer, protocol);
609
+
610
+ if (err instanceof ReqRespStatusError) {
611
+ const errorSent = await this.trySendError(stream, connection.remotePeer, protocol, err.status);
612
+ const logMessage = errorSent
613
+ ? 'Protocol error sent successfully.'
614
+ : 'Stream already closed or poisoned, not sending error response.';
615
+
616
+ const isRateLimit = err.status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
617
+
618
+ const level = isRateLimit ? 'debug' : 'warn';
619
+ this.logger[level](logMessage + ` Status: ${ReqRespStatus[err.status]}`, {
620
+ protocol,
621
+ err,
622
+ errorStatus: err.status,
623
+ cause: err.cause ?? 'Cause unknown',
624
+ });
625
+ } else {
626
+ // In erroneous case we abort the stream, this will signal the peer that something went wrong
627
+ // and that this stream should be dropped
628
+ const isMessageToNotWarn =
629
+ err instanceof Error &&
630
+ ['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
631
+ err.message.includes(msg),
632
+ );
633
+ const level = isMessageToNotWarn ? 'debug' : 'warn';
634
+ this.logger[level]('Unknown stream error while handling the stream, aborting', {
635
+ protocol,
636
+ err,
637
+ });
609
638
 
610
- await pipe(
611
- stream,
612
- async function* (source: any) {
613
- for await (const chunkList of source) {
614
- const msg = Buffer.from(chunkList.subarray());
615
- const response = await handler(connection.remotePeer, msg);
639
+ stream.abort(err);
640
+ }
641
+ } finally {
642
+ //NOTE: This is idempotent action, so it's ok to call it even if stream was aborted
643
+ await stream.close();
644
+ }
645
+ }
616
646
 
617
- if (protocol === ReqRespSubProtocol.GOODBYE) {
618
- // Don't respond
619
- await stream.close();
620
- return;
621
- }
647
+ /**
648
+ * Reads incoming data from the stream, processes it according to the sub protocol,
649
+ * and puts response back into the stream.
650
+ *
651
+ * @param protocol - The sub protocol to use for processing the stream
652
+ * @param incomingStream - The incoming stream data containing the stream and connection
653
+ *
654
+ * */
655
+ private async processStream(protocol: ReqRespSubProtocol, { stream, connection }: IncomingStreamData): Promise<void> {
656
+ const handler = this.subProtocolHandlers[protocol];
657
+ if (!handler) {
658
+ throw new Error(`No handler defined for reqresp subprotocol ${protocol}`);
659
+ }
660
+
661
+ const snappy = this.snappyTransform;
662
+ const SUCCESS = Uint8Array.of(ReqRespStatus.SUCCESS);
622
663
 
623
- // Send success code first, then the response
624
- const successChunk = Buffer.from([ReqRespStatus.SUCCESS]);
625
- yield new Uint8Array(successChunk);
664
+ await pipeline(
665
+ stream.source,
666
+ async function* (source: any) {
667
+ for await (const chunk of source) {
668
+ const response = await handler(connection.remotePeer, chunk.subarray());
626
669
 
627
- yield new Uint8Array(transform.outboundTransformNoTopic(response));
670
+ if (protocol === ReqRespSubProtocol.GOODBYE) {
671
+ // NOTE: The stream was already closed by Goodbye handler
672
+ // peerManager.goodbyeReceived(peerId, reason); will call libp2p.hangUp closing all active streams and connections
673
+ // Don't try to respond
674
+ return;
628
675
  }
629
- },
630
- stream,
631
- );
676
+
677
+ stream.metadata.written = true; // Mark the stream as written to;
678
+
679
+ yield SUCCESS;
680
+ yield snappy.outboundTransformData(response);
681
+ }
682
+ },
683
+ stream.sink,
684
+ );
685
+ }
686
+
687
+ /**
688
+ * Try to send error status to the peer. We say try, because the stream,
689
+ * might already be closed
690
+ * @param stream - The stream opened between us and the peer
691
+ * @param status - The error status to send back to the peer
692
+ * @returns true if error was sent successfully, otherwise false
693
+ *
694
+ */
695
+ private async trySendError(
696
+ stream: Stream,
697
+ peerId: PeerId,
698
+ protocol: ReqRespSubProtocol,
699
+ status: ReqRespStatus,
700
+ ): Promise<boolean> {
701
+ const canWriteToStream =
702
+ // 'writing' is a bit weird naming, but it actually means that the stream is ready to write
703
+ // 'ready' means that stream ready to be opened for writing
704
+ stream.status === 'open' && (stream.writeStatus === 'writing' || stream.writeStatus === 'ready');
705
+
706
+ // Stream was already written to, we consider it poisoned, in a sense,
707
+ // that even if we write an error response, it will not be interpreted correctly by the peer
708
+ const streamPoisoned = stream.metadata.written === true;
709
+ const shouldWriteToStream = canWriteToStream && !streamPoisoned;
710
+
711
+ if (!shouldWriteToStream) {
712
+ return false;
713
+ }
714
+
715
+ try {
716
+ await pipeline(function* () {
717
+ yield Uint8Array.of(status);
718
+ }, stream.sink);
719
+
720
+ return true;
632
721
  } catch (e: any) {
633
- this.logger.warn('Reqresp Response error: ', e);
634
- this.metrics.recordResponseError(protocol);
722
+ this.logger.warn('Error while sending error response', e);
723
+ stream.abort(e);
635
724
 
636
- // If we receive a known error, we use the error status in the response chunk, otherwise we categorize as unknown
637
- let errorStatus = ReqRespStatus.UNKNOWN;
638
- if (e instanceof ReqRespStatusError) {
639
- errorStatus = e.status;
640
- }
725
+ this.handleRequestError(e, peerId, protocol);
726
+ return false;
727
+ }
728
+ }
641
729
 
642
- const sendErrorChunk = this.sendErrorChunk(errorStatus);
730
+ private handleRequestError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
731
+ const severity = this.categorizeRequestError(e, peerId, subProtocol);
732
+ if (severity) {
733
+ this.peerScoring.penalizePeer(peerId, severity);
734
+ }
735
+ }
643
736
 
644
- // Return and yield the response chunk
645
- await pipe(
646
- stream,
647
- async function* (_source: any) {
648
- yield* sendErrorChunk;
649
- },
650
- stream,
651
- );
652
- } finally {
653
- await stream.close();
737
+ /**
738
+ * Categorize the request error and log it.
739
+ *
740
+ * @returns Severity of the error, or undefined if the error is not punishable.
741
+ */
742
+ private categorizeRequestError(
743
+ e: any,
744
+ peerId: PeerId,
745
+ subProtocol: ReqRespSubProtocol,
746
+ ): PeerErrorSeverity | undefined {
747
+ const logTags = { peerId: peerId.toString(), subProtocol };
748
+
749
+ //Punishable error - peer should never send badly formed request
750
+ if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
751
+ this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
752
+ return PeerErrorSeverity.LowToleranceError;
753
+ }
754
+
755
+ //TODO: (mralj): think if we should penalize peer here based on connection errors
756
+ return undefined;
757
+ }
758
+
759
+ /**
760
+ * Categorize the response error and log it.
761
+ *
762
+ * @returns Severity of the error, or undefined if the error is not punishable.
763
+ */
764
+ private categorizeResponseError(
765
+ e: any,
766
+ peerId: PeerId,
767
+ subProtocol: ReqRespSubProtocol,
768
+ ): PeerErrorSeverity | undefined {
769
+ const logTags = { peerId: peerId.toString(), subProtocol };
770
+
771
+ // Non punishable errors - we do not expect a response for goodbye messages
772
+ if (subProtocol === ReqRespSubProtocol.GOODBYE) {
773
+ this.logger.debug('Error encountered on goodbye sub protocol, no penalty', logTags);
774
+ return undefined;
654
775
  }
776
+
777
+ // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
778
+ if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
779
+ this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
780
+ return undefined;
781
+ }
782
+
783
+ return this.categorizeConnectionErrors(e, peerId, subProtocol);
655
784
  }
656
785
 
657
- private async *sendErrorChunk(error: ReqRespStatus): AsyncIterable<Uint8Array> {
658
- const errorChunk = Buffer.from([error]);
659
- yield new Uint8Array(errorChunk);
786
+ /*
787
+ * Errors specific to connection handling
788
+ * These can happen both when sending request and response*/
789
+ private categorizeConnectionErrors(
790
+ e: any,
791
+ peerId: PeerId,
792
+ subProtocol: ReqRespSubProtocol,
793
+ ): PeerErrorSeverity | undefined {
794
+ const logTags = { peerId: peerId.toString(), subProtocol };
795
+ // Do not punish if we are stopping the service
796
+ if (e instanceof AbortError || e?.code == 'ABORT_ERR') {
797
+ this.logger.debug(`Request aborted: ${e.message}`, logTags);
798
+ return undefined;
799
+ }
800
+
801
+ // Do not punish if we are the ones closing the connection
802
+ if (
803
+ e?.code === 'ERR_CONNECTION_BEING_CLOSED' ||
804
+ e?.code === 'ERR_CONNECTION_CLOSED' ||
805
+ e?.code === 'ERR_TRANSIENT_CONNECTION' ||
806
+ e?.message?.includes('Muxer already closed') ||
807
+ e?.message?.includes('muxer closed') ||
808
+ e?.message?.includes('ended pushable')
809
+ ) {
810
+ this.logger.debug(
811
+ `Connection closed to peer from our side: ${peerId.toString()} (${e?.message ?? 'missing error message'})`,
812
+ logTags,
813
+ );
814
+ return undefined;
815
+ }
816
+
817
+ // Pubishable errors
818
+ // Connection reset errors in the networking stack are punished with high severity
819
+ // it just signals an unreliable peer
820
+ // We assume that the requesting node has a functioning networking stack.
821
+ if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
822
+ this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
823
+ return PeerErrorSeverity.HighToleranceError;
824
+ }
825
+
826
+ if (e?.code === 'ECONNREFUSED') {
827
+ this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
828
+ return PeerErrorSeverity.HighToleranceError;
829
+ }
830
+
831
+ if (e?.code === 'ERR_UNEXPECTED_EOF') {
832
+ this.logger.debug(`Connection unexpected EOF: ${peerId.toString()}`, logTags);
833
+ return PeerErrorSeverity.HighToleranceError;
834
+ }
835
+
836
+ if (e?.code === 'ERR_UNSUPPORTED_PROTOCOL') {
837
+ this.logger.debug(`Sub protocol not supported by peer: ${peerId.toString()}`, logTags);
838
+ return PeerErrorSeverity.HighToleranceError;
839
+ }
840
+
841
+ // Timeout errors are punished with high tolerance, they can be due to a geographically far away or overloaded peer
842
+ if (e instanceof IndividualReqRespTimeoutError || e instanceof TimeoutError) {
843
+ this.logger.debug(`Timeout error in ${subProtocol}: ${e.message}`, logTags);
844
+ return PeerErrorSeverity.HighToleranceError;
845
+ }
846
+
847
+ // Catch all error
848
+ this.logger.error(`Unexpected error in ReqResp protocol`, e, logTags);
849
+ return PeerErrorSeverity.HighToleranceError;
660
850
  }
661
851
  }