@aztec/p2p 0.70.0 → 0.72.1

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 (139) hide show
  1. package/dest/client/factory.d.ts.map +1 -1
  2. package/dest/client/factory.js +6 -5
  3. package/dest/client/p2p_client.d.ts +16 -2
  4. package/dest/client/p2p_client.d.ts.map +1 -1
  5. package/dest/client/p2p_client.js +22 -12
  6. package/dest/config.d.ts +3 -0
  7. package/dest/config.d.ts.map +1 -1
  8. package/dest/config.js +6 -1
  9. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +1 -1
  10. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  11. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +3 -2
  12. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +1 -1
  13. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  14. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +3 -2
  15. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -1
  16. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  17. package/dest/mem_pools/attestation_pool/mocks.js +1 -1
  18. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +1 -1
  19. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +1 -1
  20. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +3 -2
  21. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +20 -5
  22. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +72 -9
  24. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +2 -1
  25. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool/memory_tx_pool.js +6 -2
  27. package/dest/mem_pools/tx_pool/tx_pool.d.ts +6 -0
  28. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  29. package/dest/mocks/index.d.ts +3 -3
  30. package/dest/mocks/index.d.ts.map +1 -1
  31. package/dest/mocks/index.js +22 -21
  32. package/dest/services/discv5/discV5_service.d.ts +1 -1
  33. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  34. package/dest/services/discv5/discV5_service.js +3 -3
  35. package/dest/services/dummy_service.d.ts +7 -0
  36. package/dest/services/dummy_service.d.ts.map +1 -1
  37. package/dest/services/dummy_service.js +10 -1
  38. package/dest/services/libp2p/libp2p_service.d.ts +17 -13
  39. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  40. package/dest/services/libp2p/libp2p_service.js +109 -101
  41. package/dest/services/peer-manager/metrics.d.ts +12 -0
  42. package/dest/services/peer-manager/metrics.d.ts.map +1 -0
  43. package/dest/services/peer-manager/metrics.js +26 -0
  44. package/dest/services/{peer_manager.d.ts → peer-manager/peer_manager.d.ts} +23 -8
  45. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
  46. package/dest/services/peer-manager/peer_manager.js +392 -0
  47. package/dest/services/{peer-scoring → peer-manager}/peer_scoring.d.ts +3 -0
  48. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
  49. package/dest/services/peer-manager/peer_scoring.js +84 -0
  50. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
  51. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
  52. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +81 -0
  53. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
  54. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
  55. package/dest/services/reqresp/connection-sampler/connection_sampler.js +175 -0
  56. package/dest/services/reqresp/interface.d.ts +17 -4
  57. package/dest/services/reqresp/interface.d.ts.map +1 -1
  58. package/dest/services/reqresp/interface.js +34 -11
  59. package/dest/services/reqresp/metrics.d.ts +15 -0
  60. package/dest/services/reqresp/metrics.d.ts.map +1 -0
  61. package/dest/services/reqresp/metrics.js +42 -0
  62. package/dest/services/reqresp/protocols/block.d.ts +4 -0
  63. package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
  64. package/dest/services/reqresp/protocols/block.js +9 -0
  65. package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
  66. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
  67. package/dest/services/reqresp/protocols/goodbye.js +92 -0
  68. package/dest/services/reqresp/protocols/index.d.ts +9 -0
  69. package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
  70. package/dest/services/reqresp/protocols/index.js +9 -0
  71. package/dest/services/reqresp/protocols/ping.d.ts +9 -0
  72. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
  73. package/dest/services/reqresp/protocols/ping.js +9 -0
  74. package/dest/services/reqresp/{handlers.d.ts → protocols/status.d.ts} +1 -7
  75. package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
  76. package/dest/services/reqresp/protocols/status.js +9 -0
  77. package/dest/services/reqresp/protocols/tx.d.ts +13 -0
  78. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
  79. package/dest/services/reqresp/protocols/tx.js +23 -0
  80. package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
  81. package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.js +1 -1
  82. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts +3 -3
  83. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts.map +1 -1
  84. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.js +4 -4
  85. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
  86. package/dest/services/reqresp/rate-limiter/rate_limits.js +55 -0
  87. package/dest/services/reqresp/reqresp.d.ts +33 -6
  88. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  89. package/dest/services/reqresp/reqresp.js +414 -249
  90. package/dest/services/service.d.ts +8 -0
  91. package/dest/services/service.d.ts.map +1 -1
  92. package/dest/util.d.ts +4 -0
  93. package/dest/util.d.ts.map +1 -1
  94. package/dest/util.js +1 -1
  95. package/package.json +8 -8
  96. package/src/client/factory.ts +5 -13
  97. package/src/client/p2p_client.ts +32 -11
  98. package/src/config.ts +9 -0
  99. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +2 -2
  100. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +2 -2
  101. package/src/mem_pools/attestation_pool/mocks.ts +2 -2
  102. package/src/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.ts +2 -2
  103. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +92 -7
  104. package/src/mem_pools/tx_pool/memory_tx_pool.ts +6 -2
  105. package/src/mem_pools/tx_pool/tx_pool.ts +7 -0
  106. package/src/mocks/index.ts +22 -24
  107. package/src/services/discv5/discV5_service.ts +2 -2
  108. package/src/services/dummy_service.ts +13 -0
  109. package/src/services/libp2p/libp2p_service.ts +143 -128
  110. package/src/services/peer-manager/metrics.ts +41 -0
  111. package/src/services/{peer_manager.ts → peer-manager/peer_manager.ts} +67 -22
  112. package/src/services/{peer-scoring → peer-manager}/peer_scoring.ts +16 -3
  113. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
  114. package/src/services/reqresp/connection-sampler/connection_sampler.ts +211 -0
  115. package/src/services/reqresp/interface.ts +39 -16
  116. package/src/services/reqresp/metrics.ts +57 -0
  117. package/src/services/reqresp/protocols/block.ts +15 -0
  118. package/src/services/reqresp/protocols/goodbye.ts +101 -0
  119. package/src/services/reqresp/protocols/index.ts +8 -0
  120. package/src/services/reqresp/protocols/ping.ts +8 -0
  121. package/src/services/reqresp/{handlers.ts → protocols/status.ts} +0 -9
  122. package/src/services/reqresp/protocols/tx.ts +29 -0
  123. package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.ts +3 -3
  124. package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.ts +24 -4
  125. package/src/services/reqresp/reqresp.ts +224 -25
  126. package/src/services/service.ts +12 -0
  127. package/src/util.ts +4 -0
  128. package/dest/services/peer-scoring/peer_scoring.d.ts.map +0 -1
  129. package/dest/services/peer-scoring/peer_scoring.js +0 -75
  130. package/dest/services/peer_manager.d.ts.map +0 -1
  131. package/dest/services/peer_manager.js +0 -358
  132. package/dest/services/reqresp/handlers.d.ts.map +0 -1
  133. package/dest/services/reqresp/handlers.js +0 -17
  134. package/dest/services/reqresp/rate_limiter/index.d.ts.map +0 -1
  135. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  136. package/dest/services/reqresp/rate_limiter/rate_limits.js +0 -35
  137. /package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.d.ts +0 -0
  138. /package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.d.ts +0 -0
  139. /package/src/services/reqresp/{rate_limiter → rate-limiter}/index.ts +0 -0
@@ -1,75 +0,0 @@
1
- import { PeerErrorSeverity } from '@aztec/circuit-types';
2
- import { median } from '@aztec/foundation/collection';
3
- const DefaultPeerPenalties = {
4
- [PeerErrorSeverity.LowToleranceError]: 50,
5
- [PeerErrorSeverity.MidToleranceError]: 10,
6
- [PeerErrorSeverity.HighToleranceError]: 2,
7
- };
8
- export var PeerScoreState;
9
- (function (PeerScoreState) {
10
- PeerScoreState[PeerScoreState["Banned"] = 0] = "Banned";
11
- PeerScoreState[PeerScoreState["Disconnect"] = 1] = "Disconnect";
12
- PeerScoreState[PeerScoreState["Healthy"] = 2] = "Healthy";
13
- })(PeerScoreState || (PeerScoreState = {}));
14
- // TODO: move into config / constants
15
- const MIN_SCORE_BEFORE_BAN = -100;
16
- const MIN_SCORE_BEFORE_DISCONNECT = -50;
17
- export class PeerScoring {
18
- constructor(config) {
19
- this.scores = new Map();
20
- this.lastUpdateTime = new Map();
21
- this.decayInterval = 1000 * 60; // 1 minute
22
- this.decayFactor = 0.9;
23
- const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
24
- this.peerPenalties = {
25
- [PeerErrorSeverity.HighToleranceError]: orderedValues?.[0] ?? DefaultPeerPenalties[PeerErrorSeverity.HighToleranceError],
26
- [PeerErrorSeverity.MidToleranceError]: orderedValues?.[1] ?? DefaultPeerPenalties[PeerErrorSeverity.MidToleranceError],
27
- [PeerErrorSeverity.LowToleranceError]: orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
28
- };
29
- }
30
- updateScore(peerId, scoreDelta) {
31
- const currentTime = Date.now();
32
- const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
33
- const timePassed = currentTime - lastUpdate;
34
- const decayPeriods = Math.floor(timePassed / this.decayInterval);
35
- let currentScore = this.scores.get(peerId) || 0;
36
- // Apply decay
37
- currentScore *= Math.pow(this.decayFactor, decayPeriods);
38
- // Apply new score delta
39
- currentScore += scoreDelta;
40
- this.scores.set(peerId, currentScore);
41
- this.lastUpdateTime.set(peerId, currentTime);
42
- return currentScore;
43
- }
44
- decayAllScores() {
45
- const currentTime = Date.now();
46
- for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
47
- const timePassed = currentTime - lastUpdate;
48
- const decayPeriods = Math.floor(timePassed / this.decayInterval);
49
- if (decayPeriods > 0) {
50
- let score = this.scores.get(peerId) || 0;
51
- score *= Math.pow(this.decayFactor, decayPeriods);
52
- this.scores.set(peerId, score);
53
- this.lastUpdateTime.set(peerId, currentTime);
54
- }
55
- }
56
- }
57
- getScore(peerId) {
58
- return this.scores.get(peerId) || 0;
59
- }
60
- getScoreState(peerId) {
61
- // TODO: permanently store banned peers???
62
- const score = this.getScore(peerId);
63
- if (score < MIN_SCORE_BEFORE_BAN) {
64
- return PeerScoreState.Banned;
65
- }
66
- else if (score < MIN_SCORE_BEFORE_DISCONNECT) {
67
- return PeerScoreState.Disconnect;
68
- }
69
- return PeerScoreState.Healthy;
70
- }
71
- getStats() {
72
- return { medianScore: median(Array.from(this.scores.values())) ?? 0 };
73
- }
74
- }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXItc2NvcmluZy9wZWVyX3Njb3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSXRELE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUU7SUFDekMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUU7SUFDekMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7Q0FDMUMsQ0FBQztBQUVGLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsdURBQU0sQ0FBQTtJQUNOLCtEQUFVLENBQUE7SUFDVix5REFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQscUNBQXFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDbEMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUV4QyxNQUFNLE9BQU8sV0FBVztJQU90QixZQUFZLE1BQWlCO1FBTnJCLFdBQU0sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxtQkFBYyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hELGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVc7UUFDdEMsZ0JBQVcsR0FBRyxHQUFHLENBQUM7UUFJeEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsRUFDcEMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUM7WUFDbEYsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNuQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUNqRixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEVBQ25DLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDO1NBQ2xGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQWMsRUFBRSxVQUFrQjtRQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWpFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRCxjQUFjO1FBQ2QsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV6RCx3QkFBd0I7UUFDeEIsWUFBWSxJQUFJLFVBQVUsQ0FBQztRQUUzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakUsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQztZQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjO1FBQzFCLDBDQUEwQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7WUFDakMsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLEtBQUssR0FBRywyQkFBMkIsRUFBRSxDQUFDO1lBQy9DLE9BQU8sY0FBYyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN4RSxDQUFDO0NBQ0YifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../src/services/peer_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAa,MAAM,yBAAyB,CAAC;AAGtF,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIjE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAqBzD,qBAAa,WAAY,SAAQ,UAAU;IAQvC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IAXhB,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,aAAa,CAAwC;gBAGnD,UAAU,EAAE,YAAY,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACzB,eAAe,EAAE,eAAe,EACxB,MAAM,yCAAmC;IAkB5C,SAAS;IAShB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAS5B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAOvD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC,QAAQ,CAAC,cAAc,UAAQ,GAAG,QAAQ,EAAE;IAiCnD;;OAEG;IACH,OAAO,CAAC,QAAQ;IA6DhB,OAAO,CAAC,mBAAmB;YAoBb,cAAc;IAK5B;;;OAGG;YACW,oBAAoB;YA8DpB,QAAQ;IA2BtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;IAiBxB;;;OAGG;IACI,IAAI;CAKZ"}
@@ -1,358 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { createLogger } from '@aztec/foundation/log';
3
- import { WithTracer, trackSpan } from '@aztec/telemetry-client';
4
- import { inspect } from 'util';
5
- import { PeerScoreState, PeerScoring } from './peer-scoring/peer_scoring.js';
6
- import { PeerEvent } from './types.js';
7
- const MAX_DIAL_ATTEMPTS = 3;
8
- const MAX_CACHED_PEERS = 100;
9
- const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
10
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
11
- let PeerManager = (() => {
12
- var _a;
13
- let _classSuper = WithTracer;
14
- let _instanceExtraInitializers = [];
15
- let _heartbeat_decorators;
16
- return _a = class PeerManager extends _classSuper {
17
- constructor(libP2PNode, peerDiscoveryService, config, telemetryClient, logger = createLogger('p2p:peer-manager')) {
18
- super(telemetryClient, 'PeerManager');
19
- this.libP2PNode = (__runInitializers(this, _instanceExtraInitializers), libP2PNode);
20
- this.peerDiscoveryService = peerDiscoveryService;
21
- this.config = config;
22
- this.logger = logger;
23
- this.cachedPeers = new Map();
24
- this.heartbeatCounter = 0;
25
- this.displayPeerCountsPeerHeartbeat = 0;
26
- this.timedOutPeers = new Map();
27
- this.peerScoring = new PeerScoring(config);
28
- // Handle new established connections
29
- this.libP2PNode.addEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent.bind(this));
30
- // Handle lost connections
31
- this.libP2PNode.addEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent.bind(this));
32
- // Handle Discovered peers
33
- this.peerDiscoveryService.on(PeerEvent.DISCOVERED, this.handleDiscoveredPeer.bind(this));
34
- // Display peer counts every 60 seconds
35
- this.displayPeerCountsPeerHeartbeat = Math.floor(60000 / this.config.peerCheckIntervalMS);
36
- }
37
- heartbeat() {
38
- this.heartbeatCounter++;
39
- this.peerScoring.decayAllScores();
40
- this.cleanupExpiredTimeouts();
41
- this.discover();
42
- }
43
- /**
44
- * Cleans up expired timeouts.
45
- *
46
- * When peers fail to dial after a number of retries, they are temporarily timed out.
47
- * This function removes any peers that have been in the timed out state for too long.
48
- * To give them a chance to reconnect.
49
- */
50
- cleanupExpiredTimeouts() {
51
- // Clean up expired timeouts
52
- const now = Date.now();
53
- for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
54
- if (now >= timedOutPeer.timeoutUntilMs) {
55
- this.timedOutPeers.delete(peerId);
56
- }
57
- }
58
- }
59
- /**
60
- * Simply logs the type of connected peer.
61
- * @param e - The connected peer event.
62
- */
63
- handleConnectedPeerEvent(e) {
64
- const peerId = e.detail;
65
- if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
66
- this.logger.verbose(`Connected to bootstrap peer ${peerId.toString()}`);
67
- }
68
- else {
69
- this.logger.verbose(`Connected to transaction peer ${peerId.toString()}`);
70
- }
71
- }
72
- /**
73
- * Simply logs the type of disconnected peer.
74
- * @param e - The disconnected peer event.
75
- */
76
- handleDisconnectedPeerEvent(e) {
77
- const peerId = e.detail;
78
- if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
79
- this.logger.verbose(`Disconnected from bootstrap peer ${peerId.toString()}`);
80
- }
81
- else {
82
- this.logger.verbose(`Disconnected from transaction peer ${peerId.toString()}`);
83
- }
84
- }
85
- penalizePeer(peerId, penalty) {
86
- const id = peerId.toString();
87
- const penaltyValue = this.peerScoring.peerPenalties[penalty];
88
- const newScore = this.peerScoring.updateScore(id, -penaltyValue);
89
- this.logger.verbose(`Penalizing peer ${id} with ${penalty} (new score is ${newScore})`);
90
- }
91
- getPeerScore(peerId) {
92
- return this.peerScoring.getScore(peerId);
93
- }
94
- getPeers(includePending = false) {
95
- const connected = this.libP2PNode
96
- .getPeers()
97
- .map(peer => ({ id: peer.toString(), score: this.getPeerScore(peer.toString()), status: 'connected' }));
98
- if (!includePending) {
99
- return connected;
100
- }
101
- const dialQueue = this.libP2PNode
102
- .getDialQueue()
103
- .filter(peer => !!peer.peerId)
104
- .map(peer => ({
105
- id: peer.peerId.toString(),
106
- status: 'dialing',
107
- dialStatus: peer.status,
108
- addresses: peer.multiaddrs.map(m => m.toString()),
109
- }));
110
- const cachedPeers = Array.from(this.cachedPeers.values())
111
- .filter(peer => !dialQueue.some(dialPeer => dialPeer.id && peer.peerId.toString() === dialPeer.id.toString()))
112
- .filter(peer => !connected.some(connPeer => connPeer.id.toString() === peer.peerId.toString()))
113
- .map(peer => ({
114
- status: 'cached',
115
- id: peer.peerId.toString(),
116
- addresses: [peer.multiaddrTcp.toString()],
117
- dialAttempts: peer.dialAttempts,
118
- enr: peer.enr.encodeTxt(),
119
- }));
120
- return [...connected, ...dialQueue, ...cachedPeers];
121
- }
122
- /**
123
- * Discovers peers.
124
- */
125
- discover() {
126
- const connections = this.libP2PNode.getConnections();
127
- const healthyConnections = this.pruneUnhealthyPeers(connections);
128
- // Calculate how many connections we're looking to make
129
- const peersToConnect = this.config.maxPeerCount - healthyConnections.length;
130
- const logLevel = this.heartbeatCounter % this.displayPeerCountsPeerHeartbeat === 0 ? 'info' : 'debug';
131
- this.logger[logLevel](`Connected to ${connections.length} peers`, {
132
- connections: connections.length,
133
- maxPeerCount: this.config.maxPeerCount,
134
- cachedPeers: this.cachedPeers.size,
135
- ...this.peerScoring.getStats(),
136
- });
137
- // Exit if no peers to connect
138
- if (peersToConnect <= 0) {
139
- return;
140
- }
141
- const cachedPeersToDial = [];
142
- const pendingDials = new Set(this.libP2PNode
143
- .getDialQueue()
144
- .map(pendingDial => pendingDial.peerId?.toString())
145
- .filter(Boolean));
146
- for (const [id, peerData] of this.cachedPeers.entries()) {
147
- // if already dialling or connected to, remove from cache
148
- if (pendingDials.has(id) ||
149
- healthyConnections.some(conn => conn.remotePeer.equals(peerData.peerId)) ||
150
- // if peer has been in cache for the max cache age, remove from cache
151
- Date.now() - peerData.addedUnixMs > MAX_CACHED_PEER_AGE_MS) {
152
- this.cachedPeers.delete(id);
153
- }
154
- else {
155
- // cachedPeersToDial.set(id, enr);
156
- cachedPeersToDial.push(peerData);
157
- }
158
- }
159
- // reverse to dial older entries first
160
- cachedPeersToDial.reverse();
161
- for (const peer of cachedPeersToDial) {
162
- // We remove from the cache before, as dialling will add it back if it fails
163
- this.cachedPeers.delete(peer.peerId.toString());
164
- void this.dialPeer(peer);
165
- }
166
- // if we need more peers, start randomNodesQuery
167
- if (peersToConnect > 0) {
168
- this.logger.trace(`Running random nodes query to connect to ${peersToConnect} peers`);
169
- void this.peerDiscoveryService.runRandomNodesQuery();
170
- }
171
- }
172
- pruneUnhealthyPeers(connections) {
173
- const connectedHealthyPeers = [];
174
- for (const peer of connections) {
175
- const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
176
- switch (score) {
177
- // TODO: add goodbye and give reasons
178
- case PeerScoreState.Banned:
179
- case PeerScoreState.Disconnect:
180
- void this.disconnectPeer(peer.remotePeer);
181
- break;
182
- case PeerScoreState.Healthy:
183
- connectedHealthyPeers.push(peer);
184
- }
185
- }
186
- return connectedHealthyPeers;
187
- }
188
- // TODO: send a goodbye with a reason to the peer
189
- async disconnectPeer(peer) {
190
- this.logger.debug(`Disconnecting peer ${peer.toString()}`);
191
- await this.libP2PNode.hangUp(peer);
192
- }
193
- /**
194
- * Handles a discovered peer.
195
- * @param enr - The discovered peer's ENR.
196
- */
197
- async handleDiscoveredPeer(enr) {
198
- // Check that the peer has not already been banned
199
- const peerId = await enr.peerId();
200
- const peerIdString = peerId.toString();
201
- // Check if peer is temporarily timed out
202
- const timedOutPeer = this.timedOutPeers.get(peerIdString);
203
- if (timedOutPeer) {
204
- if (Date.now() < timedOutPeer.timeoutUntilMs) {
205
- this.logger.trace(`Skipping timed out peer ${peerId}`);
206
- return;
207
- }
208
- // Timeout period expired, remove from timed out peers
209
- this.timedOutPeers.delete(peerIdString);
210
- }
211
- if (this.peerScoring.getScoreState(peerIdString) != PeerScoreState.Healthy) {
212
- return;
213
- }
214
- const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
215
- this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
216
- // stop if no tcp addr in multiaddr
217
- if (!multiaddrTcp) {
218
- this.logger.debug(`No TCP address in discovered node's multiaddr ${enr.encodeTxt()}`);
219
- return;
220
- }
221
- // check if peer is already connected
222
- const connections = this.libP2PNode.getConnections();
223
- if (connections.some(conn => conn.remotePeer.equals(peerId))) {
224
- this.logger.trace(`Already connected to peer ${peerId}`);
225
- return;
226
- }
227
- // check if peer is already in cache
228
- if (this.cachedPeers.has(peerIdString)) {
229
- this.logger.trace(`Peer already in cache ${peerIdString}`);
230
- return;
231
- }
232
- // create cached peer object
233
- const cachedPeer = {
234
- peerId,
235
- enr,
236
- multiaddrTcp,
237
- dialAttempts: 0,
238
- addedUnixMs: Date.now(),
239
- };
240
- // Determine if we should dial immediately or not
241
- if (this.shouldDialPeer()) {
242
- void this.dialPeer(cachedPeer);
243
- }
244
- else {
245
- this.logger.trace(`Caching peer ${peerIdString}`);
246
- this.cachedPeers.set(peerIdString, cachedPeer);
247
- // Prune set of cached peers
248
- this.pruneCachedPeers();
249
- }
250
- }
251
- async dialPeer(peer) {
252
- const id = peer.peerId.toString();
253
- // Add to the address book before dialing
254
- await this.libP2PNode.peerStore.merge(peer.peerId, { multiaddrs: [peer.multiaddrTcp] });
255
- this.logger.trace(`Dialing peer ${id}`);
256
- try {
257
- await this.libP2PNode.dial(peer.multiaddrTcp);
258
- }
259
- catch (error) {
260
- peer.dialAttempts++;
261
- if (peer.dialAttempts < MAX_DIAL_ATTEMPTS) {
262
- this.logger.trace(`Failed to dial peer ${id} (attempt ${peer.dialAttempts})`, { error: inspect(error) });
263
- this.cachedPeers.set(id, peer);
264
- }
265
- else {
266
- formatLibp2pDialError(error);
267
- this.logger.debug(`Failed to dial peer ${id} (dropping)`, { error: inspect(error) });
268
- this.cachedPeers.delete(id);
269
- // Add to timed out peers
270
- this.timedOutPeers.set(id, {
271
- peerId: id,
272
- timeoutUntilMs: Date.now() + FAILED_PEER_BAN_TIME_MS,
273
- });
274
- }
275
- }
276
- }
277
- shouldDialPeer() {
278
- const connections = this.libP2PNode.getConnections().length;
279
- if (connections >= this.config.maxPeerCount) {
280
- this.logger.trace(`Not dialing peer due to max peer count of ${this.config.maxPeerCount} reached (${connections} current connections)`);
281
- return false;
282
- }
283
- return true;
284
- }
285
- pruneCachedPeers() {
286
- let peersToDelete = this.cachedPeers.size - MAX_CACHED_PEERS;
287
- if (peersToDelete <= 0) {
288
- return;
289
- }
290
- // Remove the oldest peers
291
- for (const key of this.cachedPeers.keys()) {
292
- this.cachedPeers.delete(key);
293
- this.logger.trace(`Pruning peer ${key} from cache`);
294
- peersToDelete--;
295
- if (peersToDelete <= 0) {
296
- break;
297
- }
298
- }
299
- }
300
- /**
301
- * Stops the peer manager.
302
- * Removing all event listeners.
303
- */
304
- stop() {
305
- this.libP2PNode.removeEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent);
306
- this.libP2PNode.removeEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent);
307
- this.peerDiscoveryService.off(PeerEvent.DISCOVERED, this.handleDiscoveredPeer);
308
- }
309
- },
310
- (() => {
311
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
312
- _heartbeat_decorators = [trackSpan('PeerManager.heartbeat')];
313
- __esDecorate(_a, null, _heartbeat_decorators, { kind: "method", name: "heartbeat", static: false, private: false, access: { has: obj => "heartbeat" in obj, get: obj => obj.heartbeat }, metadata: _metadata }, null, _instanceExtraInitializers);
314
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
315
- })(),
316
- _a;
317
- })();
318
- export { PeerManager };
319
- /**
320
- * copied from github.com/ChainSafe/lodestar
321
- * libp2p errors with extremely noisy errors here, which are deeply nested taking 30-50 lines.
322
- * Some known errors:
323
- * ```
324
- * Error: The operation was aborted
325
- * Error: stream ended before 1 bytes became available
326
- * Error: Error occurred during XX handshake: Error occurred while verifying signed payload: Peer ID doesn't match libp2p public key
327
- * ```
328
- *
329
- * Also the error's message is not properly formatted, where the error message is indented and includes the full stack
330
- * ```
331
- * {
332
- * emessage: '\n' +
333
- * ' Error: stream ended before 1 bytes became available\n' +
334
- * ' at /home/lion/Code/eth2.0/lodestar/node_modules/it-reader/index.js:37:9\n' +
335
- * ' at runMicrotasks (<anonymous>)\n' +
336
- * ' at decoder (/home/lion/Code/eth2.0/lodestar/node_modules/it-length-prefixed/src/decode.js:113:22)\n' +
337
- * ' at first (/home/lion/Code/eth2.0/lodestar/node_modules/it-first/index.js:11:20)\n' +
338
- * ' at Object.exports.read (/home/lion/Code/eth2.0/lodestar/node_modules/multistream-select/src/multistream.js:31:15)\n' +
339
- * ' at module.exports (/home/lion/Code/eth2.0/lodestar/node_modules/multistream-select/src/select.js:21:19)\n' +
340
- * ' at Upgrader._encryptOutbound (/home/lion/Code/eth2.0/lodestar/node_modules/libp2p/src/upgrader.js:397:36)\n' +
341
- * ' at Upgrader.upgradeOutbound (/home/lion/Code/eth2.0/lodestar/node_modules/libp2p/src/upgrader.js:176:11)\n' +
342
- * ' at ClassIsWrapper.dial (/home/lion/Code/eth2.0/lodestar/node_modules/libp2p-tcp/src/index.js:49:18)'
343
- * }
344
- * ```
345
- *
346
- * Tracking issue https://github.com/libp2p/js-libp2p/issues/996
347
- */
348
- function formatLibp2pDialError(e) {
349
- const errorMessage = e.message.trim();
350
- const newlineIndex = errorMessage.indexOf('\n');
351
- e.message = newlineIndex !== -1 ? errorMessage.slice(0, newlineIndex) : errorMessage;
352
- if (e.message.includes('The operation was aborted') ||
353
- e.message.includes('stream ended before 1 bytes became available') ||
354
- e.message.includes('The operation was aborted')) {
355
- e.stack = undefined;
356
- }
357
- }
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBd0IsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS3RGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzdCLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBQzFELE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxvREFBb0Q7SUFldEYsV0FBVzs7c0JBQVMsVUFBVTs7O3NCQUE5QixXQUFZLFNBQVEsV0FBVTtZQU96QyxZQUNVLFVBQXdCLEVBQ3hCLG9CQUEwQyxFQUMxQyxNQUFpQixFQUN6QixlQUFnQyxFQUN4QixTQUFTLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztnQkFFakQsS0FBSyxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFOOUIsZUFBVSxJQVJULG1EQUFXLEVBUVosVUFBVSxFQUFjO2dCQUN4Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO2dCQUMxQyxXQUFNLEdBQU4sTUFBTSxDQUFXO2dCQUVqQixXQUFNLEdBQU4sTUFBTSxDQUFtQztnQkFYM0MsZ0JBQVcsR0FBNEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFFakQs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
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/handlers.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAExD"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Handles the ping request.
3
- * @param _msg - The ping request message.
4
- * @returns A resolved promise with the pong response.
5
- */
6
- export function pingHandler(_msg) {
7
- return Promise.resolve(Buffer.from('pong'));
8
- }
9
- /**
10
- * Handles the status request.
11
- * @param _msg - The status request message.
12
- * @returns A resolved promise with the ok response.
13
- */
14
- export function statusHandler(_msg) {
15
- return Promise.resolve(Buffer.from('ok'));
16
- }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9oYW5kbGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFTO0lBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVM7SUFDckMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDIn0=
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate_limiter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate_limits.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate_limiter/rate_limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,4BAA4B,EAAoC,MAAM,iBAAiB,CAAC;AAGrH,eAAO,MAAM,mBAAmB,EAAE,4BA+BjC,CAAC"}
@@ -1,35 +0,0 @@
1
- import { PING_PROTOCOL, STATUS_PROTOCOL, TX_REQ_PROTOCOL } from '../interface.js';
2
- // TODO(md): these defaults need to be tuned
3
- export const DEFAULT_RATE_LIMITS = {
4
- [PING_PROTOCOL]: {
5
- peerLimit: {
6
- quotaTimeMs: 1000,
7
- quotaCount: 5,
8
- },
9
- globalLimit: {
10
- quotaTimeMs: 1000,
11
- quotaCount: 10,
12
- },
13
- },
14
- [STATUS_PROTOCOL]: {
15
- peerLimit: {
16
- quotaTimeMs: 1000,
17
- quotaCount: 5,
18
- },
19
- globalLimit: {
20
- quotaTimeMs: 1000,
21
- quotaCount: 10,
22
- },
23
- },
24
- [TX_REQ_PROTOCOL]: {
25
- peerLimit: {
26
- quotaTimeMs: 1000,
27
- quotaCount: 5,
28
- },
29
- globalLimit: {
30
- quotaTimeMs: 1000,
31
- quotaCount: 10,
32
- },
33
- },
34
- };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlX2xpbWl0ZXIvcmF0ZV9saW1pdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBcUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJILDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUM7SUFDL0QsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNmLFNBQVMsRUFBRTtZQUNULFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxDQUFDO1NBQ2Q7UUFDRCxXQUFXLEVBQUU7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsRUFBRTtTQUNmO0tBQ0Y7SUFDRCxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsRUFBRTtZQUNULFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxDQUFDO1NBQ2Q7UUFDRCxXQUFXLEVBQUU7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsRUFBRTtTQUNmO0tBQ0Y7SUFDRCxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsRUFBRTtZQUNULFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxDQUFDO1NBQ2Q7UUFDRCxXQUFXLEVBQUU7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsRUFBRTtTQUNmO0tBQ0Y7Q0FDRixDQUFDIn0=