@aztec/p2p 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec5f612

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 (445) 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 +4 -4
  4. package/dest/client/factory.d.ts +10 -10
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +45 -18
  7. package/dest/client/interface.d.ts +46 -33
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +41 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +156 -200
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +21 -7
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +2 -2
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  87. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  88. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  90. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  91. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  93. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  94. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +193 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
  111. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  112. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
  114. package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  116. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  118. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  119. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  121. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  127. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  130. package/dest/msg_validators/tx_validator/factory.d.ts +118 -5
  131. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/factory.js +228 -57
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/gas_validator.js +76 -38
  136. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  137. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/index.js +1 -0
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  142. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  143. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  145. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  146. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  148. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  149. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  151. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  152. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  154. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  155. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  157. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  158. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  160. package/dest/services/data_store.d.ts +1 -1
  161. package/dest/services/data_store.d.ts.map +1 -1
  162. package/dest/services/data_store.js +10 -6
  163. package/dest/services/discv5/discV5_service.js +1 -1
  164. package/dest/services/dummy_service.d.ts +24 -4
  165. package/dest/services/dummy_service.d.ts.map +1 -1
  166. package/dest/services/dummy_service.js +46 -1
  167. package/dest/services/encoding.d.ts +3 -3
  168. package/dest/services/encoding.d.ts.map +1 -1
  169. package/dest/services/encoding.js +11 -10
  170. package/dest/services/gossipsub/index.d.ts +3 -0
  171. package/dest/services/gossipsub/index.d.ts.map +1 -0
  172. package/dest/services/gossipsub/index.js +2 -0
  173. package/dest/services/gossipsub/scoring.d.ts +21 -3
  174. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  175. package/dest/services/gossipsub/scoring.js +24 -7
  176. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  177. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  178. package/dest/services/gossipsub/topic_score_params.js +346 -0
  179. package/dest/services/index.d.ts +2 -1
  180. package/dest/services/index.d.ts.map +1 -1
  181. package/dest/services/index.js +1 -0
  182. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  183. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  184. package/dest/services/libp2p/instrumentation.js +14 -3
  185. package/dest/services/libp2p/libp2p_service.d.ts +100 -42
  186. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  187. package/dest/services/libp2p/libp2p_service.js +451 -359
  188. package/dest/services/peer-manager/metrics.d.ts +2 -2
  189. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  190. package/dest/services/peer-manager/metrics.js +20 -5
  191. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  192. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  193. package/dest/services/peer-manager/peer_scoring.js +33 -4
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  195. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  196. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
  197. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  198. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  199. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  200. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  201. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  202. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  203. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  204. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  205. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  206. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
  207. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  208. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
  209. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  210. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  211. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  212. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  213. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  214. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  215. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  216. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  217. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  218. package/dest/services/reqresp/interface.d.ts +12 -1
  219. package/dest/services/reqresp/interface.d.ts.map +1 -1
  220. package/dest/services/reqresp/interface.js +15 -1
  221. package/dest/services/reqresp/metrics.d.ts +6 -5
  222. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  223. package/dest/services/reqresp/metrics.js +17 -5
  224. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  225. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  226. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  227. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  228. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  229. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  230. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  231. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  232. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  233. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  234. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/tx.js +20 -0
  236. package/dest/services/reqresp/reqresp.d.ts +6 -1
  237. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  238. package/dest/services/reqresp/reqresp.js +71 -27
  239. package/dest/services/service.d.ts +42 -3
  240. package/dest/services/service.d.ts.map +1 -1
  241. package/dest/services/tx_collection/config.d.ts +22 -1
  242. package/dest/services/tx_collection/config.d.ts.map +1 -1
  243. package/dest/services/tx_collection/config.js +55 -1
  244. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  245. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  246. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  247. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  248. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  249. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  250. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  251. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  252. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  253. package/dest/services/tx_collection/index.d.ts +3 -1
  254. package/dest/services/tx_collection/index.d.ts.map +1 -1
  255. package/dest/services/tx_collection/index.js +2 -0
  256. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  257. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  258. package/dest/services/tx_collection/instrumentation.js +10 -2
  259. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  260. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  261. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  262. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  263. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  264. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  265. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  266. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  267. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  268. package/dest/services/tx_collection/tx_collection.d.ts +25 -12
  269. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  270. package/dest/services/tx_collection/tx_collection.js +79 -7
  271. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  272. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  273. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  274. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  275. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  276. package/dest/services/tx_collection/tx_source.js +19 -2
  277. package/dest/services/tx_file_store/config.d.ts +16 -0
  278. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  279. package/dest/services/tx_file_store/config.js +22 -0
  280. package/dest/services/tx_file_store/index.d.ts +4 -0
  281. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  282. package/dest/services/tx_file_store/index.js +3 -0
  283. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  284. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  285. package/dest/services/tx_file_store/instrumentation.js +29 -0
  286. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  287. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  288. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  289. package/dest/services/tx_provider.d.ts +4 -4
  290. package/dest/services/tx_provider.d.ts.map +1 -1
  291. package/dest/services/tx_provider.js +9 -8
  292. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  293. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  294. package/dest/services/tx_provider_instrumentation.js +5 -5
  295. package/dest/test-helpers/index.d.ts +3 -1
  296. package/dest/test-helpers/index.d.ts.map +1 -1
  297. package/dest/test-helpers/index.js +2 -0
  298. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  299. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  300. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  301. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  302. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  303. package/dest/test-helpers/mock-pubsub.js +105 -4
  304. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  305. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  306. package/dest/test-helpers/reqresp-nodes.js +4 -3
  307. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  308. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  309. package/dest/test-helpers/test_tx_provider.js +41 -0
  310. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  311. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  312. package/dest/test-helpers/testbench-utils.js +366 -0
  313. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  314. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  315. package/dest/testbench/p2p_client_testbench_worker.js +219 -138
  316. package/dest/testbench/worker_client_manager.d.ts +51 -6
  317. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  318. package/dest/testbench/worker_client_manager.js +226 -44
  319. package/dest/util.d.ts +2 -2
  320. package/dest/util.d.ts.map +1 -1
  321. package/package.json +14 -14
  322. package/src/bootstrap/bootstrap.ts +7 -4
  323. package/src/client/factory.ts +83 -36
  324. package/src/client/interface.ts +56 -34
  325. package/src/client/p2p_client.ts +192 -247
  326. package/src/client/test/tx_proposal_collector/README.md +227 -0
  327. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
  328. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  329. package/src/config.ts +47 -11
  330. package/src/errors/tx-pool.error.ts +12 -0
  331. package/src/index.ts +1 -0
  332. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  333. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  334. package/src/mem_pools/attestation_pool/index.ts +9 -2
  335. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  336. package/src/mem_pools/index.ts +4 -1
  337. package/src/mem_pools/instrumentation.ts +2 -1
  338. package/src/mem_pools/interface.ts +4 -4
  339. package/src/mem_pools/tx_pool/README.md +1 -1
  340. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  341. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  342. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  343. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  344. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  345. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  346. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  347. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  348. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  349. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  350. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  351. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  352. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  353. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  354. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  355. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  356. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  357. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  358. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
  359. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  360. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  361. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  362. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
  363. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +10 -4
  364. package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
  365. package/src/msg_validators/tx_validator/README.md +115 -0
  366. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  367. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  368. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  369. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  370. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  371. package/src/msg_validators/tx_validator/factory.ts +372 -55
  372. package/src/msg_validators/tx_validator/gas_validator.ts +98 -29
  373. package/src/msg_validators/tx_validator/index.ts +1 -0
  374. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  375. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  376. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  377. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  378. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  379. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  380. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  381. package/src/services/data_store.ts +10 -7
  382. package/src/services/discv5/discV5_service.ts +1 -1
  383. package/src/services/dummy_service.ts +59 -2
  384. package/src/services/encoding.ts +9 -9
  385. package/src/services/gossipsub/README.md +641 -0
  386. package/src/services/gossipsub/index.ts +2 -0
  387. package/src/services/gossipsub/scoring.ts +29 -5
  388. package/src/services/gossipsub/topic_score_params.ts +487 -0
  389. package/src/services/index.ts +1 -0
  390. package/src/services/libp2p/instrumentation.ts +15 -2
  391. package/src/services/libp2p/libp2p_service.ts +496 -397
  392. package/src/services/peer-manager/metrics.ts +21 -4
  393. package/src/services/peer-manager/peer_scoring.ts +29 -1
  394. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  395. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
  396. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  397. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  398. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  399. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
  400. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  401. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  402. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  403. package/src/services/reqresp/interface.ts +29 -1
  404. package/src/services/reqresp/metrics.ts +34 -9
  405. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  406. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  407. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  408. package/src/services/reqresp/protocols/tx.ts +22 -0
  409. package/src/services/reqresp/reqresp.ts +82 -23
  410. package/src/services/service.ts +55 -2
  411. package/src/services/tx_collection/config.ts +83 -1
  412. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  413. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  414. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  415. package/src/services/tx_collection/index.ts +6 -0
  416. package/src/services/tx_collection/instrumentation.ts +17 -2
  417. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  418. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  419. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  420. package/src/services/tx_collection/tx_collection.ts +117 -20
  421. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  422. package/src/services/tx_collection/tx_source.ts +22 -3
  423. package/src/services/tx_file_store/config.ts +37 -0
  424. package/src/services/tx_file_store/index.ts +3 -0
  425. package/src/services/tx_file_store/instrumentation.ts +36 -0
  426. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  427. package/src/services/tx_provider.ts +10 -9
  428. package/src/services/tx_provider_instrumentation.ts +11 -5
  429. package/src/test-helpers/index.ts +2 -0
  430. package/src/test-helpers/make-test-p2p-clients.ts +3 -5
  431. package/src/test-helpers/mock-pubsub.ts +146 -9
  432. package/src/test-helpers/reqresp-nodes.ts +4 -6
  433. package/src/test-helpers/test_tx_provider.ts +64 -0
  434. package/src/test-helpers/testbench-utils.ts +430 -0
  435. package/src/testbench/p2p_client_testbench_worker.ts +333 -131
  436. package/src/testbench/worker_client_manager.ts +304 -47
  437. package/src/util.ts +7 -1
  438. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  439. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  440. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  441. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  442. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  443. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  444. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  445. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -0,0 +1,34 @@
1
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
2
+ import type { PeerId } from '@libp2p/interface';
3
+ import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
4
+ import type { ITxMetadataCollection } from './interface.js';
5
+ declare class MissingTxMetadata {
6
+ readonly txHash: string;
7
+ requestedCount: number;
8
+ inFlightCount: number;
9
+ tx: Tx | undefined;
10
+ readonly peers: Set<string>;
11
+ constructor(txHash: string, requestedCount?: number, inFlightCount?: number, tx?: Tx | undefined, peers?: Set<string>);
12
+ markAsRequested(): void;
13
+ markInFlight(): void;
14
+ markNotInFlight(): void;
15
+ isInFlight(): boolean;
16
+ }
17
+ export declare class MissingTxMetadataCollection implements ITxMetadataCollection {
18
+ private missingTxsTracker;
19
+ private readonly txBatchSize;
20
+ private txMetadata;
21
+ constructor(missingTxsTracker: IMissingTxsTracker, txBatchSize?: number);
22
+ getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[];
23
+ getMissingTxHashes(): Set<string>;
24
+ getTxsPeerHas(peer: PeerId): Set<string>;
25
+ getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
26
+ markRequested(txHash: TxHash): void;
27
+ markInFlightBySmartPeer(txHash: TxHash): void;
28
+ markNotInFlightBySmartPeer(txHash: TxHash): void;
29
+ alreadyFetched(txHash: TxHash): boolean;
30
+ markFetched(peerId: PeerId, tx: Tx): boolean;
31
+ markPeerHas(peerId: PeerId, txHash: TxHash[]): void;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZ190eHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL2JhdGNoLXR4LXJlcXVlc3Rlci9taXNzaW5nX3R4cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVELGNBQU0saUJBQWlCO2FBRUgsTUFBTSxFQUFFLE1BQU07SUFDdkIsY0FBYztJQUNkLGFBQWE7SUFDYixFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVM7YUFDVCxLQUFLO0lBTHZCLFlBQ2tCLE1BQU0sRUFBRSxNQUFNLEVBQ3ZCLGNBQWMsU0FBSSxFQUNsQixhQUFhLFNBQUksRUFDakIsRUFBRSxHQUFFLEVBQUUsR0FBRyxTQUFxQixFQUNyQixLQUFLLGNBQW9CLEVBQ3ZDO0lBRUcsZUFBZSxTQUVyQjtJQUVNLFlBQVksU0FFbEI7SUFFTSxlQUFlLFNBRXJCO0lBRU0sVUFBVSxJQUFJLE9BQU8sQ0FFM0I7Q0FDRjtBQU9ELHFCQUFhLDJCQUE0QixZQUFXLHFCQUFxQjtJQUlyRSxPQUFPLENBQUMsaUJBQWlCO0lBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUo5QixPQUFPLENBQUMsVUFBVSxDQUF3QztJQUUxRCxZQUNVLGlCQUFpQixFQUFFLGtCQUFrQixFQUM1QixXQUFXLEdBQUUsTUFBaUQsRUFHaEY7SUFFTSw4Q0FBOEMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLEVBQUUsQ0FleEY7SUFFTSxrQkFBa0IsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBRXZDO0lBRU0sYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQVc5QztJQUVNLDBCQUEwQixDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBdUJ4RDtJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxRQUVsQztJQU9NLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLFFBRTVDO0lBTU0sMEJBQTBCLENBQUMsTUFBTSxFQUFFLE1BQU0sUUFFL0M7SUFFTSxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBRTdDO0lBRU0sV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBY2xEO0lBRU0sV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQVVsRDtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missing_txs.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/missing_txs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,cAAM,iBAAiB;aAEH,MAAM,EAAE,MAAM;IACvB,cAAc;IACd,aAAa;IACb,EAAE,EAAE,EAAE,GAAG,SAAS;aACT,KAAK;IALvB,YACkB,MAAM,EAAE,MAAM,EACvB,cAAc,SAAI,EAClB,aAAa,SAAI,EACjB,EAAE,GAAE,EAAE,GAAG,SAAqB,EACrB,KAAK,cAAoB,EACvC;IAEG,eAAe,SAErB;IAEM,YAAY,SAElB;IAEM,eAAe,SAErB;IAEM,UAAU,IAAI,OAAO,CAE3B;CACF;AAOD,qBAAa,2BAA4B,YAAW,qBAAqB;IAIrE,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,UAAU,CAAwC;IAE1D,YACU,iBAAiB,EAAE,kBAAkB,EAC5B,WAAW,GAAE,MAAiD,EAGhF;IAEM,8CAA8C,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAexF;IAEM,kBAAkB,IAAI,GAAG,CAAC,MAAM,CAAC,CAEvC;IAEM,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAW9C;IAEM,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBxD;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,QAElC;IAOM,uBAAuB,CAAC,MAAM,EAAE,MAAM,QAE5C;IAMM,0BAA0B,CAAC,MAAM,EAAE,MAAM,QAE/C;IAEM,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7C;IAEM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAclD;IAEM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAUlD;CACF"}
@@ -0,0 +1,130 @@
1
+ import { TxHash } from '@aztec/stdlib/tx';
2
+ import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
3
+ class MissingTxMetadata {
4
+ txHash;
5
+ requestedCount;
6
+ inFlightCount;
7
+ tx;
8
+ peers;
9
+ constructor(txHash, requestedCount = 0, inFlightCount = 0, tx = undefined, peers = new Set()){
10
+ this.txHash = txHash;
11
+ this.requestedCount = requestedCount;
12
+ this.inFlightCount = inFlightCount;
13
+ this.tx = tx;
14
+ this.peers = peers;
15
+ }
16
+ markAsRequested() {
17
+ this.requestedCount++;
18
+ }
19
+ markInFlight() {
20
+ this.inFlightCount++;
21
+ }
22
+ markNotInFlight() {
23
+ this.inFlightCount = Math.max(--this.inFlightCount, 0);
24
+ }
25
+ isInFlight() {
26
+ return this.inFlightCount > 0;
27
+ }
28
+ }
29
+ /*
30
+ * Single source or truth for transactions we are fetching
31
+ * This could be better optimized but given expected count of missing txs (N < 100)
32
+ * At the moment there is no need for it. And benefit is that we have everything in single store
33
+ * */ export class MissingTxMetadataCollection {
34
+ missingTxsTracker;
35
+ txBatchSize;
36
+ txMetadata;
37
+ constructor(missingTxsTracker, txBatchSize = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE){
38
+ this.missingTxsTracker = missingTxsTracker;
39
+ this.txBatchSize = txBatchSize;
40
+ this.txMetadata = new Map();
41
+ missingTxsTracker.missingTxHashes.forEach((hash)=>this.txMetadata.set(hash, new MissingTxMetadata(hash)));
42
+ }
43
+ getPrioritizingNotInFlightAndLowerRequestCount(txs) {
44
+ const filtered = Array.from(this.txMetadata.values()).filter((txMeta)=>txs.includes(txMeta.txHash.toString()));
45
+ const [notInFlight, inFlight] = filtered.reduce((buckets, tx)=>{
46
+ tx.isInFlight() ? buckets[1].push(tx) : buckets[0].push(tx);
47
+ return buckets;
48
+ }, [
49
+ [],
50
+ []
51
+ ]);
52
+ notInFlight.sort((a, b)=>a.requestedCount - b.requestedCount);
53
+ inFlight.sort((a, b)=>a.inFlightCount - b.inFlightCount);
54
+ return [
55
+ ...notInFlight,
56
+ ...inFlight
57
+ ];
58
+ }
59
+ getMissingTxHashes() {
60
+ return this.missingTxsTracker.missingTxHashes;
61
+ }
62
+ getTxsPeerHas(peer) {
63
+ const peerIdStr = peer.toString();
64
+ const txsPeerHas = new Set();
65
+ this.txMetadata.values().forEach((txMeta)=>{
66
+ if (txMeta.peers.has(peerIdStr)) {
67
+ txsPeerHas.add(txMeta.txHash.toString());
68
+ }
69
+ });
70
+ return txsPeerHas;
71
+ }
72
+ getTxsToRequestFromThePeer(peer) {
73
+ const txsPeerHas = this.getTxsPeerHas(peer);
74
+ const missingTxHashes = this.getMissingTxHashes();
75
+ const txsToRequest = txsPeerHas.intersection(missingTxHashes);
76
+ if (txsToRequest.size >= this.txBatchSize) {
77
+ return this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(txsToRequest)).map((t)=>TxHash.fromString(t.txHash)).slice(0, this.txBatchSize);
78
+ }
79
+ // Otherwise fill the txs to request till txBatchSize with random txs we are missing
80
+ // Who knows, maybe we get lucky and peer received these txs in the meantime
81
+ const countToFill = this.txBatchSize - txsToRequest.size;
82
+ const txsToFill = this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(this.getMissingTxHashes().difference(txsToRequest))).slice(0, countToFill).map((t)=>TxHash.fromString(t.txHash));
83
+ return [
84
+ ...Array.from(txsToRequest).map((t)=>TxHash.fromString(t)),
85
+ ...txsToFill
86
+ ];
87
+ }
88
+ markRequested(txHash) {
89
+ this.txMetadata.get(txHash.toString())?.markAsRequested();
90
+ }
91
+ /*
92
+ * This should be called only when requesting tx from smart peer
93
+ * Because the smart peer should return this tx, whereas
94
+ * "dumb" peer might return it, or might not - we don't know
95
+ * */ markInFlightBySmartPeer(txHash) {
96
+ this.txMetadata.get(txHash.toString())?.markInFlight();
97
+ }
98
+ /*
99
+ * This should be called only when requesting tx from smart peer
100
+ * Because the smart peer should return this tx, whereas
101
+ * "dumb" peer might return it, or might not - we don't know*/ markNotInFlightBySmartPeer(txHash) {
102
+ this.txMetadata.get(txHash.toString())?.markNotInFlight();
103
+ }
104
+ alreadyFetched(txHash) {
105
+ return !this.missingTxsTracker.isMissing(txHash.toString());
106
+ }
107
+ markFetched(peerId, tx) {
108
+ const txHashStr = tx.txHash.toString();
109
+ const txMeta = this.txMetadata.get(txHashStr);
110
+ if (!txMeta) {
111
+ //TODO: what to do about peer which sent txs we didn't request?
112
+ // 1. don't request from it in the scope of this batch request
113
+ // 2. ban it immediately?
114
+ // 3. track it and ban it?
115
+ //
116
+ return false;
117
+ }
118
+ txMeta.peers.add(peerId.toString());
119
+ return this.missingTxsTracker.markFetched(tx);
120
+ }
121
+ markPeerHas(peerId, txHash) {
122
+ const peerIdStr = peerId.toString();
123
+ txHash.map((t)=>t.toString()).forEach((txh)=>{
124
+ const txMeta = this.txMetadata.get(txh);
125
+ if (txMeta) {
126
+ txMeta.peers.add(peerIdStr);
127
+ }
128
+ });
129
+ }
130
+ }
@@ -0,0 +1,60 @@
1
+ import type { DateProvider } from '@aztec/foundation/timer';
2
+ import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import type { PeerId } from '@libp2p/interface';
4
+ import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
5
+ import type { IPeerPenalizer } from './interface.js';
6
+ export declare const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000;
7
+ export interface IPeerCollection {
8
+ markPeerSmart(peerId: PeerId): void;
9
+ /** Sample next peer in round-robin fashion. No smart peers if returns undefined */
10
+ nextSmartPeerToQuery(): PeerId | undefined;
11
+ /** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
12
+ nextDumbPeerToQuery(): PeerId | undefined;
13
+ thereAreSomeDumbRatelimitExceededPeers(): boolean;
14
+ penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
15
+ unMarkPeerAsBad(peerId: PeerId): void;
16
+ getBadPeers(): Set<string>;
17
+ markPeerInFlight(peerId: PeerId): void;
18
+ unMarkPeerInFlight(peerId: PeerId): void;
19
+ markPeerRateLimitExceeded(peerId: PeerId): void;
20
+ getRateLimitExceededPeers(): Set<string>;
21
+ getPeerRateLimitDelayMs(peerId: PeerId): number | undefined;
22
+ getNextDumbPeerAvailabilityDelayMs(): number | undefined;
23
+ getNextSmartPeerAvailabilityDelayMs(): number | undefined;
24
+ }
25
+ export declare class PeerCollection implements IPeerCollection {
26
+ private readonly connectionSampler;
27
+ private readonly pinnedPeerId;
28
+ private readonly dateProvider;
29
+ private readonly badPeerThreshold;
30
+ private readonly peerPenalizer?;
31
+ private readonly smartPeers;
32
+ private readonly inFlightPeers;
33
+ private readonly rateLimitExceededPeers;
34
+ private readonly peerPenaltyCounters;
35
+ private readonly badPeers;
36
+ constructor(connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>, pinnedPeerId: PeerId | undefined, dateProvider: DateProvider, badPeerThreshold?: number, peerPenalizer?: IPeerPenalizer | undefined);
37
+ markPeerSmart(peerId: PeerId): void;
38
+ private queriedSmartPeers;
39
+ private queriedDumbPeers;
40
+ private static nextPeer;
41
+ nextSmartPeerToQuery(): PeerId | undefined;
42
+ nextDumbPeerToQuery(): PeerId | undefined;
43
+ private get availableSmartPeers();
44
+ private get availableDumbPeers();
45
+ thereAreSomeDumbRatelimitExceededPeers(): boolean;
46
+ markPeerInFlight(peerId: PeerId): void;
47
+ unMarkPeerInFlight(peerId: PeerId): void;
48
+ markPeerRateLimitExceeded(peerId: PeerId): void;
49
+ getRateLimitExceededPeers(): Set<string>;
50
+ penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
51
+ unMarkPeerAsBad(peerId: PeerId): void;
52
+ getBadPeers(): Set<string>;
53
+ getPeerRateLimitDelayMs(peerId: PeerId): number | undefined;
54
+ getNextDumbPeerAvailabilityDelayMs(): number | undefined;
55
+ getNextSmartPeerAvailabilityDelayMs(): number | undefined;
56
+ private getNextRateLimitDelayMs;
57
+ private orderedPeers;
58
+ private get peers();
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvcGVlcl9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRCxlQUFPLE1BQU0sa0NBQWtDLE9BQU8sQ0FBQztBQUV2RCxNQUFNLFdBQVcsZUFBZTtJQUM5QixhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFFcEMsbUZBQW1GO0lBQ25GLG9CQUFvQixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDM0Msa0ZBQWtGO0lBQ2xGLG1CQUFtQixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFFMUMsc0NBQXNDLElBQUksT0FBTyxDQUFDO0lBQ2xELFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEUsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLFdBQVcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDekMseUJB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer_collection.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/peer_collection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,mFAAmF;IACnF,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAAC;IAE1C,sCAAsC,IAAI,OAAO,CAAC;IAClD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,yBAAyB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5D,kCAAkC,IAAI,MAAM,GAAG,SAAS,CAAC;IACzD,mCAAmC,IAAI,MAAM,GAAG,SAAS,CAAC;CAC3D;AAED,qBAAa,cAAe,YAAW,eAAe;IAQlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAXjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA6B;IACpE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,YACmB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,EACnF,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,GAAE,MAAsD,EACxE,aAAa,CAAC,4BAAgB,EAQhD;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzC;IAGD,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,OAAO,CAAC,MAAM,CAAC,QAAQ;IAehB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAEhD;IAEM,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAE/C;IAED,OAAO,KAAK,mBAAmB,GAI9B;IAED,OAAO,KAAK,kBAAkB,GAI7B;IAEM,sCAAsC,IAAI,OAAO,CAKvD;IAEM,gBAAgB,CAAC,MAAM,EAAE,MAAM,QAErC;IAEM,kBAAkB,CAAC,MAAM,EAAE,MAAM,QAMvC;IAEM,yBAAyB,CAAC,MAAM,EAAE,MAAM,QAG9C;IAEM,yBAAyB,IAAI,GAAG,CAAC,MAAM,CAAC,CAa9C;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAQrE;IAEM,eAAe,CAAC,MAAM,EAAE,MAAM,QAIpC;IAEM,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,CAEhC;IAEM,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAejE;IAEM,kCAAkC,IAAI,MAAM,GAAG,SAAS,CAW9D;IAEM,mCAAmC,IAAI,MAAM,GAAG,SAAS,CAK/D;IAED,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,KAAK,KAAK,GAmBhB;CACF"}
@@ -0,0 +1,173 @@
1
+ import { peerIdFromString } from '@libp2p/peer-id';
2
+ import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
3
+ export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
4
+ export class PeerCollection {
5
+ connectionSampler;
6
+ pinnedPeerId;
7
+ dateProvider;
8
+ badPeerThreshold;
9
+ peerPenalizer;
10
+ smartPeers;
11
+ inFlightPeers;
12
+ rateLimitExceededPeers;
13
+ peerPenaltyCounters;
14
+ badPeers;
15
+ constructor(connectionSampler, pinnedPeerId, dateProvider, badPeerThreshold = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD, peerPenalizer){
16
+ this.connectionSampler = connectionSampler;
17
+ this.pinnedPeerId = pinnedPeerId;
18
+ this.dateProvider = dateProvider;
19
+ this.badPeerThreshold = badPeerThreshold;
20
+ this.peerPenalizer = peerPenalizer;
21
+ this.smartPeers = new Set();
22
+ this.inFlightPeers = new Set();
23
+ this.rateLimitExceededPeers = new Map();
24
+ this.peerPenaltyCounters = new Map();
25
+ this.badPeers = new Set();
26
+ this.queriedSmartPeers = new Set();
27
+ this.queriedDumbPeers = new Set();
28
+ this.orderedPeers = new Set();
29
+ // Pinned peer is treated specially, always mark it as in-flight
30
+ // and never return it as part of smart/dumb peers
31
+ if (this.pinnedPeerId) {
32
+ const peerIdStr = this.pinnedPeerId.toString();
33
+ this.inFlightPeers.add(peerIdStr);
34
+ }
35
+ }
36
+ markPeerSmart(peerId) {
37
+ this.smartPeers.add(peerId.toString());
38
+ }
39
+ // We keep track of all peers that are queried for peer sampling algorithm
40
+ queriedSmartPeers;
41
+ queriedDumbPeers;
42
+ static nextPeer(allPeers, queried) {
43
+ if (allPeers.size === 0) {
44
+ return undefined;
45
+ }
46
+ const availablePeers = allPeers.difference(queried);
47
+ let [first] = availablePeers;
48
+ if (first === undefined) {
49
+ // We queried all peers. Start over
50
+ [first] = allPeers;
51
+ queried.clear();
52
+ }
53
+ queried.add(first);
54
+ return peerIdFromString(first);
55
+ }
56
+ nextSmartPeerToQuery() {
57
+ return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
58
+ }
59
+ nextDumbPeerToQuery() {
60
+ return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
61
+ }
62
+ get availableSmartPeers() {
63
+ return this.peers.intersection(this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())));
64
+ }
65
+ get availableDumbPeers() {
66
+ return this.peers.difference(this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()));
67
+ }
68
+ thereAreSomeDumbRatelimitExceededPeers() {
69
+ return this.getRateLimitExceededPeers().difference(this.smartPeers.union(this.badPeers).union(this.inFlightPeers)).size > 0;
70
+ }
71
+ markPeerInFlight(peerId) {
72
+ this.inFlightPeers.add(peerId.toString());
73
+ }
74
+ unMarkPeerInFlight(peerId) {
75
+ // Never unmark the pinned peer as in-flight
76
+ if (this.pinnedPeerId && this.pinnedPeerId.toString() === peerId.toString()) {
77
+ return;
78
+ }
79
+ this.inFlightPeers.delete(peerId.toString());
80
+ }
81
+ markPeerRateLimitExceeded(peerId) {
82
+ const ttl = this.dateProvider.now() + RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL;
83
+ this.rateLimitExceededPeers.set(peerId.toString(), ttl);
84
+ }
85
+ getRateLimitExceededPeers() {
86
+ const now = this.dateProvider.now();
87
+ const rateLimitedPeers = new Set();
88
+ for (const [peerId, expirationTime] of this.rateLimitExceededPeers){
89
+ if (expirationTime <= now) {
90
+ this.rateLimitExceededPeers.delete(peerId);
91
+ } else {
92
+ rateLimitedPeers.add(peerId);
93
+ }
94
+ }
95
+ return rateLimitedPeers;
96
+ }
97
+ penalisePeer(peerId, severity) {
98
+ const key = peerId.toString();
99
+ const newPenaltyCount = (this.peerPenaltyCounters.get(key) ?? 0) + 1;
100
+ this.peerPenaltyCounters.set(key, newPenaltyCount);
101
+ this.peerPenalizer?.penalizePeer(peerId, severity);
102
+ if (newPenaltyCount > this.badPeerThreshold) {
103
+ this.badPeers.add(key);
104
+ }
105
+ }
106
+ unMarkPeerAsBad(peerId) {
107
+ const key = peerId.toString();
108
+ this.badPeers.delete(key);
109
+ this.peerPenaltyCounters.delete(key);
110
+ }
111
+ getBadPeers() {
112
+ return new Set(this.badPeers);
113
+ }
114
+ getPeerRateLimitDelayMs(peerId) {
115
+ const key = peerId.toString();
116
+ const expiry = this.rateLimitExceededPeers.get(key);
117
+ const peerIsNotRateLimited = expiry === undefined;
118
+ if (peerIsNotRateLimited) {
119
+ return undefined;
120
+ }
121
+ const now = this.dateProvider.now();
122
+ const rateLimitHasExpired = expiry <= now;
123
+ if (rateLimitHasExpired) {
124
+ this.rateLimitExceededPeers.delete(key);
125
+ return undefined;
126
+ }
127
+ return expiry - now;
128
+ }
129
+ getNextDumbPeerAvailabilityDelayMs() {
130
+ // Note: this _is_ suboptimal
131
+ // (we could've tracked rate limits ) per dumb/smart peers - different collections
132
+ // but everything is in memory and small scale so this, wile suboptimal is not slow
133
+ return this.getNextRateLimitDelayMs((peerIdStr)=>!this.smartPeers.has(peerIdStr) && !this.getBadPeers().has(peerIdStr) && !this.inFlightPeers.has(peerIdStr) && this.peers.has(peerIdStr));
134
+ }
135
+ getNextSmartPeerAvailabilityDelayMs() {
136
+ return this.getNextRateLimitDelayMs((peerIdStr)=>this.smartPeers.has(peerIdStr) && !this.getBadPeers().has(peerIdStr) && !this.inFlightPeers.has(peerIdStr));
137
+ }
138
+ getNextRateLimitDelayMs(filter) {
139
+ const now = this.dateProvider.now();
140
+ let minExpiry;
141
+ for (const [peerIdStr, expiry] of this.rateLimitExceededPeers){
142
+ const rateLimitHasExpired = expiry <= now;
143
+ if (rateLimitHasExpired) {
144
+ this.rateLimitExceededPeers.delete(peerIdStr);
145
+ continue;
146
+ }
147
+ const peerDoesNotMatchFilter = !filter(peerIdStr);
148
+ if (peerDoesNotMatchFilter) {
149
+ continue;
150
+ }
151
+ minExpiry = minExpiry === undefined ? expiry : Math.min(minExpiry, expiry);
152
+ }
153
+ const noRateLimitedPeersMatchFilter = minExpiry === undefined;
154
+ if (noRateLimitedPeersMatchFilter) {
155
+ return undefined;
156
+ }
157
+ return minExpiry - now;
158
+ }
159
+ orderedPeers;
160
+ get peers() {
161
+ const pinnedStr = this.pinnedPeerId?.toString();
162
+ const currentlyConnected = new Set(this.connectionSampler.getPeerListSortedByConnectionCountAsc().map((p)=>p.toString()).filter((p)=>p !== pinnedStr));
163
+ // Remove disconnected peers, preserving order of the rest.
164
+ this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
165
+ // Append newly connected peers at the end (lowest priority).
166
+ for (const peer of currentlyConnected){
167
+ if (!this.orderedPeers.has(peer)) {
168
+ this.orderedPeers.add(peer);
169
+ }
170
+ }
171
+ return this.orderedPeers;
172
+ }
173
+ }
@@ -0,0 +1,20 @@
1
+ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
2
+ import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ export interface BatchRequestTxValidatorConfig {
4
+ l1ChainId: number;
5
+ rollupVersion: number;
6
+ proofVerifier: ClientProtocolCircuitVerifier;
7
+ }
8
+ export interface IBatchRequestTxValidator {
9
+ validateRequestedTx(tx: Tx): Promise<TxValidationResult>;
10
+ validateRequestedTxs(txs: Tx[]): Promise<TxValidationResult[]>;
11
+ }
12
+ export declare class BatchRequestTxValidator implements IBatchRequestTxValidator {
13
+ private readonly config;
14
+ readonly txValidator: TxValidator;
15
+ constructor(config: BatchRequestTxValidatorConfig);
16
+ validateRequestedTx(tx: Tx): Promise<TxValidationResult>;
17
+ validateRequestedTxs(txs: Tx[]): Promise<TxValidationResult[]>;
18
+ static createRequestedTxValidator(config: BatchRequestTxValidatorConfig): TxValidator;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvdHhfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLGtCQUFrQixFQUFFLEtBQUssV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJakYsTUFBTSxXQUFXLDZCQUE2QjtJQUM1QyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsYUFBYSxFQUFFLDZCQUE2QixDQUFDO0NBQzlDO0FBRUQsTUFBTSxXQUFXLHdCQUF3QjtJQUN2QyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pELG9CQUFvQixDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0NBQ2hFO0FBRUQscUJBQWEsdUJBQXdCLFlBQVcsd0JBQXdCO0lBRTFELE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQURuQyxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztJQUNsQyxZQUE2QixNQUFNLEVBQUUsNkJBQTZCLEVBRWpFO0lBRVksbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FFcEU7SUFFWSxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FFMUU7SUFFRCxNQUFNLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLDZCQUE2QixHQUFHLFdBQVcsQ0FLcEY7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_validator.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIjF,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,6BAA6B,CAAC;CAC9C;AAED,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzD,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CAChE;AAED,qBAAa,uBAAwB,YAAW,wBAAwB;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM;IADnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,YAA6B,MAAM,EAAE,6BAA6B,EAEjE;IAEY,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAEpE;IAEY,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE1E;IAED,MAAM,CAAC,0BAA0B,CAAC,MAAM,EAAE,6BAA6B,GAAG,WAAW,CAKpF;CACF"}
@@ -0,0 +1,21 @@
1
+ import { createTxValidatorForReqResponseReceivedTxs } from '../../../msg_validators/index.js';
2
+ export class BatchRequestTxValidator {
3
+ config;
4
+ txValidator;
5
+ constructor(config){
6
+ this.config = config;
7
+ this.txValidator = BatchRequestTxValidator.createRequestedTxValidator(this.config);
8
+ }
9
+ async validateRequestedTx(tx) {
10
+ return await this.txValidator.validateTx(tx);
11
+ }
12
+ async validateRequestedTxs(txs) {
13
+ return await Promise.all(txs.map((tx)=>this.validateRequestedTx(tx)));
14
+ }
15
+ static createRequestedTxValidator(config) {
16
+ return createTxValidatorForReqResponseReceivedTxs(config.proofVerifier, {
17
+ l1ChainId: config.l1ChainId,
18
+ rollupVersion: config.rollupVersion
19
+ });
20
+ }
21
+ }
@@ -18,14 +18,33 @@ export declare class BatchConnectionSampler {
18
18
  private readonly logger;
19
19
  private readonly batch;
20
20
  private readonly requestsPerPeer;
21
+ /** Tracks peer-index combinations that returned empty/invalid responses */
22
+ private readonly failedPeerIndices;
21
23
  constructor(connectionSampler: ConnectionSampler, batchSize: number, maxPeers: number, exclude?: PeerId[], logger?: import("@aztec/foundation/log").Logger);
22
24
  /**
23
- * Gets the peer responsible for handling a specific request index
25
+ * Gets the peer responsible for handling a specific request index.
26
+ * If the primary peer has previously failed for this index, tries other peers.
27
+ * If all batch peers have failed, attempts to sample a new peer.
24
28
  *
25
29
  * @param index - The request index
26
- * @returns The peer assigned to handle this request
30
+ * @returns The peer assigned to handle this request, or undefined if no peer available
27
31
  */
28
32
  getPeerForRequest(index: number): PeerId | undefined;
33
+ /**
34
+ * Attempts to sample a new peer that isn't already in the batch.
35
+ * If successful, adds the peer to the batch.
36
+ *
37
+ * @returns The new peer if one was sampled, undefined otherwise
38
+ */
39
+ private sampleNewPeer;
40
+ /**
41
+ * Marks that a peer returned an empty/invalid response for a specific request index.
42
+ * The peer will not be assigned this index again.
43
+ *
44
+ * @param peerId - The peer that failed
45
+ * @param index - The request index that failed
46
+ */
47
+ markPeerFailedForIndex(peerId: PeerId, index: number): void;
29
48
  /**
30
49
  * Removes a peer and replaces it with a new one, maintaining the same position
31
50
  * in the batch array to keep request distribution consistent
@@ -42,4 +61,4 @@ export declare class BatchConnectionSampler {
42
61
  */
43
62
  get requestsPerBucket(): number;
44
63
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfY29ubmVjdGlvbl9zYW1wbGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25uZWN0aW9uLXNhbXBsZXIvYmF0Y2hfY29ubmVjdGlvbl9zYW1wbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gscUJBQWEsc0JBQXNCO0lBSy9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCO0lBSWxDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQVJ6QixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQVM7SUFFekMsWUFDbUIsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3JELFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUNELE1BQU0seUNBQXVELEVBZS9FO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBUW5EO0lBRUQ7Ozs7O09BS0c7SUFDSCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FpQnpDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGVBQWUsSUFBSSxNQUFNLENBRTVCO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGlCQUFpQixJQUFJLE1BQU0sQ0FFOUI7Q0FDRiJ9
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfY29ubmVjdGlvbl9zYW1wbGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25uZWN0aW9uLXNhbXBsZXIvYmF0Y2hfY29ubmVjdGlvbl9zYW1wbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gscUJBQWEsc0JBQXNCO0lBTy9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCO0lBSWxDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQVZ6QixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQVM7SUFDekMsMkVBQTJFO0lBQzNFLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQXVDO0lBRXpFLFlBQ21CLGlCQUFpQixFQUFFLGlCQUFpQixFQUNyRCxTQUFTLEVBQUUsTUFBTSxFQUNqQixRQUFRLEVBQUUsTUFBTSxFQUNoQixPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFDRCxNQUFNLHlDQUF1RCxFQWUvRTtJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBMkJuRDtJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLGFBQWE7SUFjckI7Ozs7OztPQU1HO0lBQ0gsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FTMUQ7SUFFRDs7Ozs7T0FLRztJQUNILG9CQUFvQixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQWlCekM7SUFFRDs7T0FFRztJQUNILElBQUksZUFBZSxJQUFJLE1BQU0sQ0FFNUI7SUFFRDs7T0FFRztJQUNILElBQUksaUJBQWlCLElBQUksTUFBTSxDQUU5QjtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"batch_connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/batch_connection_sampler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YACmB,iBAAiB,EAAE,iBAAiB,EACrD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAAE,EACD,MAAM,yCAAuD,EAe/E;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQnD;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBzC;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF"}
1
+ {"version":3,"file":"batch_connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/batch_connection_sampler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IAEzE,YACmB,iBAAiB,EAAE,iBAAiB,EACrD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAAE,EACD,MAAM,yCAAuD,EAe/E;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2BnD;IAED;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;;;OAMG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS1D;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBzC;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF"}
@@ -16,10 +16,12 @@ import { createLogger } from '@aztec/foundation/log';
16
16
  logger;
17
17
  batch;
18
18
  requestsPerPeer;
19
+ /** Tracks peer-index combinations that returned empty/invalid responses */ failedPeerIndices;
19
20
  constructor(connectionSampler, batchSize, maxPeers, exclude, logger = createLogger('p2p:reqresp:batch-connection-sampler')){
20
21
  this.connectionSampler = connectionSampler;
21
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
  }
@@ -36,17 +38,74 @@ import { createLogger } from '@aztec/foundation/log';
36
38
  this.batch = this.connectionSampler.samplePeersBatch(maxPeers, excluding);
37
39
  }
38
40
  /**
39
- * 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.
40
44
  *
41
45
  * @param index - The request index
42
- * @returns The peer assigned to handle this request
46
+ * @returns The peer assigned to handle this request, or undefined if no peer available
43
47
  */ getPeerForRequest(index) {
44
48
  if (this.batch.length === 0) {
45
49
  return undefined;
46
50
  }
47
51
  // Calculate which peer bucket this index belongs to
48
- const peerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
49
- 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
+ });
50
109
  }
51
110
  /**
52
111
  * Removes a peer and replaces it with a new one, maintaining the same position
@@ -49,6 +49,7 @@ export declare class ConnectionSampler {
49
49
  peer: PeerId | undefined;
50
50
  sampledPeers: PeerId[];
51
51
  };
52
+ getPeerListSortedByConnectionCountAsc(excluding?: Set<string>): PeerId[];
52
53
  /**
53
54
  * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
54
55
  *
@@ -72,4 +73,4 @@ export declare class ConnectionSampler {
72
73
  close(stream: Stream): Promise<void>;
73
74
  private cleanupStaleConnections;
74
75
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbl9zYW1wbGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25uZWN0aW9uLXNhbXBsZXIvY29ubmVjdGlvbl9zYW1wbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJaEUscUJBQWEsYUFBYTtJQUN4QixNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sVUFFakI7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILHFCQUFhLGlCQUFpQjtJQVkxQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFkdkIsT0FBTyxDQUFDLGVBQWUsQ0FBaUI7SUFHeEMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFhO0lBRzNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBYTtJQUVwRCxPQUFPLENBQUMsV0FBVyxDQUEwQztJQUU3RCxZQUNtQixNQUFNLEVBQUUsTUFBTSxFQUNkLE9BQU8sRUFBRSxhQUFhLEVBQ3RCLE1BQU0seUNBQWlELEVBQ3ZELElBQUksR0FBRTtRQUFFLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQUMsd0JBQXdCLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBTyxFQU0vRjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFTVDtJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FLNUQ7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGVBQWUsQ0FDYixLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQ2YsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDL0I7UUFDRCxJQUFJLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN6QixZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEIsQ0FxQ0E7SUFFRDs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBc0NuRjtJQUlEOzs7Ozs7O09BT0c7SUFDRyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBcUJ0RjtJQUVEOztPQUVHO0lBQ0csS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWlDekM7WUFLYSx1QkFBdUI7Q0F1QnRDIn0=
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;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;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
+ {"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"}