@aztec/p2p 0.71.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 (107) hide show
  1. package/dest/client/p2p_client.d.ts.map +1 -1
  2. package/dest/client/p2p_client.js +6 -6
  3. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -1
  4. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  5. package/dest/mem_pools/attestation_pool/mocks.js +1 -1
  6. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  7. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +2 -2
  8. package/dest/mocks/index.d.ts +3 -3
  9. package/dest/mocks/index.d.ts.map +1 -1
  10. package/dest/mocks/index.js +19 -18
  11. package/dest/services/dummy_service.d.ts +7 -0
  12. package/dest/services/dummy_service.d.ts.map +1 -1
  13. package/dest/services/dummy_service.js +10 -1
  14. package/dest/services/libp2p/libp2p_service.d.ts +17 -13
  15. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  16. package/dest/services/libp2p/libp2p_service.js +109 -101
  17. package/dest/services/peer-manager/metrics.d.ts +12 -0
  18. package/dest/services/peer-manager/metrics.d.ts.map +1 -0
  19. package/dest/services/peer-manager/metrics.js +26 -0
  20. package/dest/services/{peer_manager.d.ts → peer-manager/peer_manager.d.ts} +23 -8
  21. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
  22. package/dest/services/peer-manager/peer_manager.js +392 -0
  23. package/dest/services/{peer-scoring → peer-manager}/peer_scoring.d.ts +3 -0
  24. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
  25. package/dest/services/peer-manager/peer_scoring.js +84 -0
  26. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
  27. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
  28. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +81 -0
  29. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
  30. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
  31. package/dest/services/reqresp/connection-sampler/connection_sampler.js +175 -0
  32. package/dest/services/reqresp/interface.d.ts +17 -4
  33. package/dest/services/reqresp/interface.d.ts.map +1 -1
  34. package/dest/services/reqresp/interface.js +34 -11
  35. package/dest/services/reqresp/metrics.d.ts +15 -0
  36. package/dest/services/reqresp/metrics.d.ts.map +1 -0
  37. package/dest/services/reqresp/metrics.js +42 -0
  38. package/dest/services/reqresp/protocols/block.d.ts +4 -0
  39. package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
  40. package/dest/services/reqresp/protocols/block.js +9 -0
  41. package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
  42. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
  43. package/dest/services/reqresp/protocols/goodbye.js +92 -0
  44. package/dest/services/reqresp/protocols/index.d.ts +9 -0
  45. package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
  46. package/dest/services/reqresp/protocols/index.js +9 -0
  47. package/dest/services/reqresp/protocols/ping.d.ts +9 -0
  48. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
  49. package/dest/services/reqresp/protocols/ping.js +9 -0
  50. package/dest/services/reqresp/{handlers.d.ts → protocols/status.d.ts} +1 -7
  51. package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
  52. package/dest/services/reqresp/protocols/status.js +9 -0
  53. package/dest/services/reqresp/protocols/tx.d.ts +13 -0
  54. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
  55. package/dest/services/reqresp/protocols/tx.js +23 -0
  56. package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
  57. package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.js +1 -1
  58. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts +3 -3
  59. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts.map +1 -1
  60. package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.js +4 -4
  61. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
  62. package/dest/services/reqresp/rate-limiter/rate_limits.js +55 -0
  63. package/dest/services/reqresp/reqresp.d.ts +33 -6
  64. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  65. package/dest/services/reqresp/reqresp.js +414 -249
  66. package/dest/services/service.d.ts +8 -0
  67. package/dest/services/service.d.ts.map +1 -1
  68. package/dest/util.d.ts +4 -0
  69. package/dest/util.d.ts.map +1 -1
  70. package/dest/util.js +1 -1
  71. package/package.json +8 -8
  72. package/src/client/p2p_client.ts +5 -5
  73. package/src/mem_pools/attestation_pool/mocks.ts +2 -2
  74. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -1
  75. package/src/mocks/index.ts +19 -20
  76. package/src/services/dummy_service.ts +13 -0
  77. package/src/services/libp2p/libp2p_service.ts +143 -128
  78. package/src/services/peer-manager/metrics.ts +41 -0
  79. package/src/services/{peer_manager.ts → peer-manager/peer_manager.ts} +67 -22
  80. package/src/services/{peer-scoring → peer-manager}/peer_scoring.ts +16 -3
  81. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
  82. package/src/services/reqresp/connection-sampler/connection_sampler.ts +211 -0
  83. package/src/services/reqresp/interface.ts +39 -16
  84. package/src/services/reqresp/metrics.ts +57 -0
  85. package/src/services/reqresp/protocols/block.ts +15 -0
  86. package/src/services/reqresp/protocols/goodbye.ts +101 -0
  87. package/src/services/reqresp/protocols/index.ts +8 -0
  88. package/src/services/reqresp/protocols/ping.ts +8 -0
  89. package/src/services/reqresp/{handlers.ts → protocols/status.ts} +0 -9
  90. package/src/services/reqresp/protocols/tx.ts +29 -0
  91. package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.ts +3 -3
  92. package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.ts +24 -4
  93. package/src/services/reqresp/reqresp.ts +224 -25
  94. package/src/services/service.ts +12 -0
  95. package/src/util.ts +4 -0
  96. package/dest/services/peer-scoring/peer_scoring.d.ts.map +0 -1
  97. package/dest/services/peer-scoring/peer_scoring.js +0 -75
  98. package/dest/services/peer_manager.d.ts.map +0 -1
  99. package/dest/services/peer_manager.js +0 -358
  100. package/dest/services/reqresp/handlers.d.ts.map +0 -1
  101. package/dest/services/reqresp/handlers.js +0 -17
  102. package/dest/services/reqresp/rate_limiter/index.d.ts.map +0 -1
  103. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  104. package/dest/services/reqresp/rate_limiter/rate_limits.js +0 -35
  105. /package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.d.ts +0 -0
  106. /package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.d.ts +0 -0
  107. /package/src/services/reqresp/{rate_limiter → rate-limiter}/index.ts +0 -0
@@ -0,0 +1,81 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ /**
3
+ * Manages batches of peers for parallel request processing.
4
+ * Tracks active peers and provides deterministic peer assignment for requests.
5
+ *
6
+ * Example with 3 peers and 10 requests:
7
+ *
8
+ * Peers: [P1] [P2] [P3]
9
+ * ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
10
+ * Requests: 0,1,2,9 | 3,4,5 | 6,7,8
11
+ *
12
+ * Each peer handles a bucket of consecutive requests.
13
+ * If a peer fails, it is replaced while maintaining the same bucket.
14
+ */
15
+ export class BatchConnectionSampler {
16
+ constructor(connectionSampler, batchSize, maxPeers) {
17
+ this.connectionSampler = connectionSampler;
18
+ this.logger = createLogger('p2p:reqresp:batch-connection-sampler');
19
+ this.batch = [];
20
+ if (maxPeers <= 0) {
21
+ throw new Error('Max peers cannot be 0');
22
+ }
23
+ if (batchSize <= 0) {
24
+ throw new Error('Batch size cannot be 0');
25
+ }
26
+ // Calculate how many requests each peer should handle, cannot be 0
27
+ this.requestsPerPeer = Math.max(1, Math.floor(batchSize / maxPeers));
28
+ // Sample initial peers
29
+ this.batch = this.connectionSampler.samplePeersBatch(maxPeers);
30
+ }
31
+ /**
32
+ * Gets the peer responsible for handling a specific request index
33
+ *
34
+ * @param index - The request index
35
+ * @returns The peer assigned to handle this request
36
+ */
37
+ getPeerForRequest(index) {
38
+ if (this.batch.length === 0) {
39
+ return undefined;
40
+ }
41
+ // Calculate which peer bucket this index belongs to
42
+ const peerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
43
+ return this.batch[peerIndex];
44
+ }
45
+ /**
46
+ * Removes a peer and replaces it with a new one, maintaining the same position
47
+ * in the batch array to keep request distribution consistent
48
+ *
49
+ * @param peerId - The peer to remove and replace
50
+ */
51
+ removePeerAndReplace(peerId) {
52
+ const index = this.batch.findIndex(p => p === peerId);
53
+ if (index === -1) {
54
+ return;
55
+ }
56
+ const excluding = new Map([[peerId.toString(), true]]);
57
+ const newPeer = this.connectionSampler.getPeer(excluding);
58
+ if (newPeer) {
59
+ this.batch[index] = newPeer;
60
+ this.logger.trace(`Replaced peer ${peerId} with ${newPeer}`, { peerId, newPeer });
61
+ }
62
+ else {
63
+ // If we couldn't get a replacement, remove the peer and compact the array
64
+ this.batch.splice(index, 1);
65
+ this.logger.trace(`Removed peer ${peerId}`, { peerId });
66
+ }
67
+ }
68
+ /**
69
+ * Gets the number of active peers
70
+ */
71
+ get activePeerCount() {
72
+ return this.batch.length;
73
+ }
74
+ /**
75
+ * Gets the number of requests each peer is assigned to handle
76
+ */
77
+ get requestsPerBucket() {
78
+ return this.requestsPerPeer;
79
+ }
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfY29ubmVjdGlvbl9zYW1wbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvY29ubmVjdGlvbi1zYW1wbGVyL2JhdGNoX2Nvbm5lY3Rpb25fc2FtcGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNckQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQyxZQUE2QixpQkFBb0MsRUFBRSxTQUFpQixFQUFFLFFBQWdCO1FBQXpFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFKaEQsV0FBTSxHQUFHLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzlELFVBQUssR0FBYSxFQUFFLENBQUM7UUFJcEMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFckUsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGlCQUFpQixDQUFDLEtBQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsTUFBYztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUN0RCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLE1BQU0sU0FBUyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7YUFBTSxDQUFDO1lBQ04sMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,61 @@
1
+ import { type Libp2p, type PeerId, type Stream } from '@libp2p/interface';
2
+ export declare class RandomSampler {
3
+ random(max: number): number;
4
+ }
5
+ /**
6
+ * A class that samples peers from the libp2p node and returns a peer that we don't already have a connection open to.
7
+ * If we already have a connection open, we try to sample a different peer.
8
+ * We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
9
+ *
10
+ * @dev Close must always be called on connections, else memory leak
11
+ */
12
+ export declare class ConnectionSampler {
13
+ private readonly libp2p;
14
+ private readonly cleanupIntervalMs;
15
+ private readonly sampler;
16
+ private readonly logger;
17
+ private cleanupInterval;
18
+ private abortController;
19
+ private readonly activeConnectionsCount;
20
+ private readonly streams;
21
+ private dialQueue;
22
+ constructor(libp2p: Libp2p, cleanupIntervalMs?: number, // Default to 1 minute
23
+ sampler?: RandomSampler);
24
+ /**
25
+ * Stops the cleanup job and closes all active connections
26
+ */
27
+ stop(): Promise<void>;
28
+ /**
29
+ *
30
+ * @param excluding - The peers to exclude from the sampling
31
+ * This is to prevent sampling with replacement
32
+ * @returns
33
+ */
34
+ getPeer(excluding?: Map<string, boolean>): PeerId | undefined;
35
+ /**
36
+ * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
37
+ *
38
+ * @param numberToSample - The number of peers to sample
39
+ * @returns Array of unique sampled peers, prioritizing those without active connections
40
+ */
41
+ samplePeersBatch(numberToSample: number): PeerId[];
42
+ /**
43
+ * Dials a protocol and returns the stream
44
+ *
45
+ * @param peerId - The peer id
46
+ * @param protocol - The protocol
47
+ * @returns The stream
48
+ */
49
+ dialProtocol(peerId: PeerId, protocol: string): Promise<Stream>;
50
+ /**
51
+ * Closes a stream and updates the active connections count
52
+ *
53
+ * @param streamId - The stream id
54
+ */
55
+ close(streamId: string): Promise<void>;
56
+ /**
57
+ * Cleans up stale connections that we have lost accounting for
58
+ */
59
+ private cleanupStaleConnections;
60
+ }
61
+ //# sourceMappingURL=connection_sampler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/connection_sampler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAS1E,qBAAa,aAAa;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAA0C;IAEjE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAGnE,OAAO,CAAC,SAAS,CAAkC;gBAGhC,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAc,EAAE,sBAAsB;IACzD,OAAO,GAAE,aAAmC;IAO/D;;OAEG;IACG,IAAI;IAaV;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;IA+B7D;;;;;OAKG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAkClD;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBrE;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5C;;OAEG;YACW,uBAAuB;CAetC"}
@@ -0,0 +1,175 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { SerialQueue } from '@aztec/foundation/queue';
3
+ const MAX_SAMPLE_ATTEMPTS = 4;
4
+ export class RandomSampler {
5
+ random(max) {
6
+ return Math.floor(Math.random() * max);
7
+ }
8
+ }
9
+ /**
10
+ * A class that samples peers from the libp2p node and returns a peer that we don't already have a connection open to.
11
+ * If we already have a connection open, we try to sample a different peer.
12
+ * We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
13
+ *
14
+ * @dev Close must always be called on connections, else memory leak
15
+ */
16
+ export class ConnectionSampler {
17
+ constructor(libp2p, cleanupIntervalMs = 60000, // Default to 1 minute
18
+ sampler = new RandomSampler()) {
19
+ this.libp2p = libp2p;
20
+ this.cleanupIntervalMs = cleanupIntervalMs;
21
+ this.sampler = sampler;
22
+ this.logger = createLogger('p2p:reqresp:connection-sampler');
23
+ this.abortController = new AbortController();
24
+ this.activeConnectionsCount = new Map();
25
+ this.streams = new Map();
26
+ // Serial queue to ensure that we only dial one peer at a time
27
+ this.dialQueue = new SerialQueue();
28
+ this.cleanupInterval = setInterval(() => void this.cleanupStaleConnections(), this.cleanupIntervalMs);
29
+ this.dialQueue.start();
30
+ }
31
+ /**
32
+ * Stops the cleanup job and closes all active connections
33
+ */
34
+ async stop() {
35
+ this.logger.info('Stopping connection sampler');
36
+ clearInterval(this.cleanupInterval);
37
+ this.abortController.abort();
38
+ await this.dialQueue.end();
39
+ // Close all active streams
40
+ const closePromises = Array.from(this.streams.keys()).map(streamId => this.close(streamId));
41
+ await Promise.all(closePromises);
42
+ this.logger.info('Connection sampler stopped');
43
+ }
44
+ /**
45
+ *
46
+ * @param excluding - The peers to exclude from the sampling
47
+ * This is to prevent sampling with replacement
48
+ * @returns
49
+ */
50
+ getPeer(excluding) {
51
+ // In libp2p getPeers performs a shallow copy, so this array can be sliced from safetly
52
+ const peers = this.libp2p.getPeers();
53
+ if (peers.length === 0) {
54
+ return undefined;
55
+ }
56
+ let randomIndex = this.sampler.random(peers.length);
57
+ let attempts = 0;
58
+ // Keep sampling while:
59
+ // - we haven't exceeded max attempts AND
60
+ // - either the peer has active connections OR is in the exclusion list
61
+ while (attempts < MAX_SAMPLE_ATTEMPTS &&
62
+ ((this.activeConnectionsCount.get(peers[randomIndex]) ?? 0) > 0 ||
63
+ (excluding?.get(peers[randomIndex]?.toString()) ?? false))) {
64
+ peers.splice(randomIndex, 1);
65
+ randomIndex = this.sampler.random(peers.length);
66
+ attempts++;
67
+ }
68
+ this.logger.trace(`Sampled peer in ${attempts} attempts`, {
69
+ attempts,
70
+ peer: peers[randomIndex]?.toString(),
71
+ });
72
+ return peers[randomIndex];
73
+ }
74
+ /**
75
+ * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
76
+ *
77
+ * @param numberToSample - The number of peers to sample
78
+ * @returns Array of unique sampled peers, prioritizing those without active connections
79
+ */
80
+ samplePeersBatch(numberToSample) {
81
+ const peers = this.libp2p.getPeers();
82
+ const sampledPeers = [];
83
+ const peersWithConnections = []; // Hold onto peers with active connections incase we need to sample more
84
+ for (const peer of peers) {
85
+ const activeConnections = this.activeConnectionsCount.get(peer) ?? 0;
86
+ if (activeConnections === 0) {
87
+ if (sampledPeers.push(peer) === numberToSample) {
88
+ return sampledPeers;
89
+ }
90
+ }
91
+ else {
92
+ peersWithConnections.push(peer);
93
+ }
94
+ }
95
+ // If we still need more peers, sample from those with connections
96
+ while (sampledPeers.length < numberToSample && peersWithConnections.length > 0) {
97
+ const randomIndex = this.sampler.random(peersWithConnections.length);
98
+ const [peer] = peersWithConnections.splice(randomIndex, 1);
99
+ sampledPeers.push(peer);
100
+ }
101
+ this.logger.trace(`Batch sampled ${sampledPeers.length} unique peers`, {
102
+ peers: sampledPeers,
103
+ withoutConnections: sampledPeers.length - peersWithConnections.length,
104
+ withConnections: peersWithConnections.length,
105
+ });
106
+ return sampledPeers;
107
+ }
108
+ // Set of passthrough functions to keep track of active connections
109
+ /**
110
+ * Dials a protocol and returns the stream
111
+ *
112
+ * @param peerId - The peer id
113
+ * @param protocol - The protocol
114
+ * @returns The stream
115
+ */
116
+ async dialProtocol(peerId, protocol) {
117
+ // Dialling at the same time can cause race conditions where two different streams
118
+ // end up with the same id, hence a serial queue
119
+ const stream = await this.dialQueue.put(() => this.libp2p.dialProtocol(peerId, protocol, { signal: this.abortController.signal }));
120
+ this.streams.set(stream.id, { stream, peerId });
121
+ const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 0) + 1;
122
+ this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
123
+ this.logger.trace(`Dialed protocol ${protocol} with peer ${peerId.toString()}`, {
124
+ streamId: stream.id,
125
+ peerId: peerId.toString(),
126
+ activeConnectionsCount: updatedActiveConnectionsCount,
127
+ });
128
+ return stream;
129
+ }
130
+ /**
131
+ * Closes a stream and updates the active connections count
132
+ *
133
+ * @param streamId - The stream id
134
+ */
135
+ async close(streamId) {
136
+ try {
137
+ const { stream, peerId } = this.streams.get(streamId);
138
+ const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 1) - 1;
139
+ this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
140
+ this.logger.trace(`Closing connection to peer ${peerId.toString()}`, {
141
+ streamId,
142
+ peerId: peerId.toString(),
143
+ protocol: stream.protocol,
144
+ activeConnectionsCount: updatedActiveConnectionsCount,
145
+ });
146
+ await stream?.close();
147
+ }
148
+ catch (error) {
149
+ this.logger.warn(`Failed to close connection to peer with stream id ${streamId}`);
150
+ }
151
+ finally {
152
+ this.streams.delete(streamId);
153
+ }
154
+ }
155
+ /**
156
+ * Cleans up stale connections that we have lost accounting for
157
+ */
158
+ async cleanupStaleConnections() {
159
+ // Look for streams without anything in the activeConnectionsCount
160
+ // If we find anything, close the stream
161
+ for (const [streamId, { peerId }] of this.streams.entries()) {
162
+ try {
163
+ // Check if we have lost track of accounting
164
+ if (this.activeConnectionsCount.get(peerId) === 0) {
165
+ await this.close(streamId);
166
+ this.logger.debug(`Cleaned up stale connection ${streamId} to peer ${peerId.toString()}`);
167
+ }
168
+ }
169
+ catch (error) {
170
+ this.logger.error(`Error cleaning up stale connection ${streamId}`, { error });
171
+ }
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbl9zYW1wbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvY29ubmVjdGlvbi1zYW1wbGVyL2Nvbm5lY3Rpb25fc2FtcGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXRELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBTzlCLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQVc1QixZQUNtQixNQUFjLEVBQ2Qsb0JBQTRCLEtBQUssRUFBRSxzQkFBc0I7SUFDekQsVUFBeUIsSUFBSSxhQUFhLEVBQUU7UUFGNUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFDakMsWUFBTyxHQUFQLE9BQU8sQ0FBcUM7UUFiOUMsV0FBTSxHQUFHLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRWpFLG9CQUFlLEdBQW9CLElBQUksZUFBZSxFQUFFLENBQUM7UUFFaEQsMkJBQXNCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEQsWUFBTyxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRW5FLDhEQUE4RDtRQUN0RCxjQUFTLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFPakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFB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
@@ -3,13 +3,21 @@
3
3
  import { type PeerId } from '@libp2p/interface';
4
4
  export declare const PING_PROTOCOL = "/aztec/req/ping/0.1.0";
5
5
  export declare const STATUS_PROTOCOL = "/aztec/req/status/0.1.0";
6
+ export declare const GOODBYE_PROTOCOL = "/aztec/req/goodbye/0.1.0";
6
7
  export declare const TX_REQ_PROTOCOL = "/aztec/req/tx/0.1.0";
7
- export type ReqRespSubProtocol = typeof PING_PROTOCOL | typeof STATUS_PROTOCOL | typeof TX_REQ_PROTOCOL;
8
+ export declare const BLOCK_REQ_PROTOCOL = "/aztec/req/block/0.1.0";
9
+ export declare enum ReqRespSubProtocol {
10
+ PING = "/aztec/req/ping/0.1.0",
11
+ STATUS = "/aztec/req/status/0.1.0",
12
+ GOODBYE = "/aztec/req/goodbye/0.1.0",
13
+ TX = "/aztec/req/tx/0.1.0",
14
+ BLOCK = "/aztec/req/block/0.1.0"
15
+ }
8
16
  /**
9
17
  * A handler for a sub protocol
10
18
  * The message will arrive as a buffer, and the handler must return a buffer
11
19
  */
12
- export type ReqRespSubProtocolHandler = (msg: Buffer) => Promise<Buffer>;
20
+ export type ReqRespSubProtocolHandler = (peerId: PeerId, msg: Buffer) => Promise<Buffer>;
13
21
  /**
14
22
  * A type mapping from supprotocol to it's rate limits
15
23
  */
@@ -39,7 +47,7 @@ export interface ProtocolRateLimitQuota {
39
47
  }
40
48
  export declare const noopValidator: () => Promise<boolean>;
41
49
  /**
42
- * A type mapping from supprotocol to it's handling funciton
50
+ * A type mapping from supprotocol to it's handling function
43
51
  */
44
52
  export type ReqRespSubProtocolHandlers = Record<ReqRespSubProtocol, ReqRespSubProtocolHandler>;
45
53
  type ResponseValidator<RequestIdentifier, Response> = (request: RequestIdentifier, response: Response, peerId: PeerId) => Promise<boolean>;
@@ -62,7 +70,12 @@ export declare const DEFAULT_SUB_PROTOCOL_HANDLERS: ReqRespSubProtocolHandlers;
62
70
  * The Request Response Pair interface defines the methods that each
63
71
  * request response pair must implement
64
72
  */
65
- interface RequestResponsePair<Req, Res> {
73
+ interface RequestResponsePair<Req extends {
74
+ toBuffer(): Buffer;
75
+ }, Res> {
76
+ /**
77
+ * The request must implement the toBuffer method (generic serialisation)
78
+ */
66
79
  request: new (...args: any[]) => Req;
67
80
  /**
68
81
  * The response must implement the static fromBuffer method (generic serialisation)
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,eAAO,MAAM,aAAa,0BAA0B,CAAC;AACrD,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAGrD,MAAM,MAAM,kBAAkB,GAAG,OAAO,aAAa,GAAG,OAAO,eAAe,GAAG,OAAO,eAAe,CAAC;AAExG;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,SAAS,EAAE,cAAc,CAAC;IAC1B;;OAEG;IACH,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,wBAA8B,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;AAE/F,KAAK,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CACpD,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,4BAA4B,GAAG;KACxC,CAAC,IAAI,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,4BAI7C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;CACzD,CAAC;AAUF;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,0BAI3C,CAAC;AAEF;;;GAGG;AACH,UAAU,mBAAmB,CAAC,GAAG,EAAE,GAAG;IACpC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACrC;;OAEG;IACH,QAAQ,EAAE;QACR,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;KACjC,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IACT,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;IAEjC,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;CAGjC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAa5B,CAAC"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":";;AAGA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,eAAO,MAAM,aAAa,0BAA0B,CAAC;AACrD,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,eAAe,wBAAwB,CAAC;AACrD,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D,oBAAY,kBAAkB;IAC5B,IAAI,0BAAgB;IACpB,MAAM,4BAAkB;IACxB,OAAO,6BAAmB;IAC1B,EAAE,wBAAkB;IACpB,KAAK,2BAAqB;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,SAAS,EAAE,cAAc,CAAC;IAC1B;;OAEG;IACH,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,wBAA8B,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;AAE/F,KAAK,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CACpD,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,4BAA4B,GAAG;KACxC,CAAC,IAAI,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,4BAM7C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;CACzD,CAAC;AAUF;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,0BAM3C,CAAC;AAEF;;;GAGG;AACH,UAAU,mBAAmB,CAAC,GAAG,SAAS;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,EAAE,GAAG;IACnE;;OAEG;IACH,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACrC;;OAEG;IACH,QAAQ,EAAE;QACR,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;KACjC,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IACT,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;IAEjC,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;CAGjC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAqB5B,CAAC"}
@@ -1,15 +1,28 @@
1
- import { Tx, TxHash } from '@aztec/circuit-types';
1
+ import { L2Block, Tx, TxHash } from '@aztec/circuit-types';
2
+ import { Fr } from '@aztec/foundation/fields';
2
3
  /*
3
4
  * Request Response Sub Protocols
4
5
  */
5
6
  export const PING_PROTOCOL = '/aztec/req/ping/0.1.0';
6
7
  export const STATUS_PROTOCOL = '/aztec/req/status/0.1.0';
8
+ export const GOODBYE_PROTOCOL = '/aztec/req/goodbye/0.1.0';
7
9
  export const TX_REQ_PROTOCOL = '/aztec/req/tx/0.1.0';
10
+ export const BLOCK_REQ_PROTOCOL = '/aztec/req/block/0.1.0';
11
+ export var ReqRespSubProtocol;
12
+ (function (ReqRespSubProtocol) {
13
+ ReqRespSubProtocol["PING"] = "/aztec/req/ping/0.1.0";
14
+ ReqRespSubProtocol["STATUS"] = "/aztec/req/status/0.1.0";
15
+ ReqRespSubProtocol["GOODBYE"] = "/aztec/req/goodbye/0.1.0";
16
+ ReqRespSubProtocol["TX"] = "/aztec/req/tx/0.1.0";
17
+ ReqRespSubProtocol["BLOCK"] = "/aztec/req/block/0.1.0";
18
+ })(ReqRespSubProtocol || (ReqRespSubProtocol = {}));
8
19
  export const noopValidator = () => Promise.resolve(true);
9
20
  export const DEFAULT_SUB_PROTOCOL_VALIDATORS = {
10
- [PING_PROTOCOL]: noopValidator,
11
- [STATUS_PROTOCOL]: noopValidator,
12
- [TX_REQ_PROTOCOL]: noopValidator,
21
+ [ReqRespSubProtocol.PING]: noopValidator,
22
+ [ReqRespSubProtocol.STATUS]: noopValidator,
23
+ [ReqRespSubProtocol.TX]: noopValidator,
24
+ [ReqRespSubProtocol.GOODBYE]: noopValidator,
25
+ [ReqRespSubProtocol.BLOCK]: noopValidator,
13
26
  };
14
27
  /**
15
28
  * Default handler for unimplemented sub protocols, this SHOULD be overwritten
@@ -22,9 +35,11 @@ const defaultHandler = (_msg) => {
22
35
  * Default sub protocol handlers - this SHOULD be overwritten by the service,
23
36
  */
24
37
  export const DEFAULT_SUB_PROTOCOL_HANDLERS = {
25
- [PING_PROTOCOL]: defaultHandler,
26
- [STATUS_PROTOCOL]: defaultHandler,
27
- [TX_REQ_PROTOCOL]: defaultHandler,
38
+ [ReqRespSubProtocol.PING]: defaultHandler,
39
+ [ReqRespSubProtocol.STATUS]: defaultHandler,
40
+ [ReqRespSubProtocol.TX]: defaultHandler,
41
+ [ReqRespSubProtocol.GOODBYE]: defaultHandler,
42
+ [ReqRespSubProtocol.BLOCK]: defaultHandler,
28
43
  };
29
44
  /**
30
45
  * RequestableBuffer is a wrapper around a buffer that allows it to be
@@ -49,17 +64,25 @@ export class RequestableBuffer {
49
64
  * as a type rather than an object
50
65
  */
51
66
  export const subProtocolMap = {
52
- [PING_PROTOCOL]: {
67
+ [ReqRespSubProtocol.PING]: {
53
68
  request: RequestableBuffer,
54
69
  response: RequestableBuffer,
55
70
  },
56
- [STATUS_PROTOCOL]: {
71
+ [ReqRespSubProtocol.STATUS]: {
57
72
  request: RequestableBuffer,
58
73
  response: RequestableBuffer,
59
74
  },
60
- [TX_REQ_PROTOCOL]: {
75
+ [ReqRespSubProtocol.TX]: {
61
76
  request: TxHash,
62
77
  response: Tx,
63
78
  },
79
+ [ReqRespSubProtocol.GOODBYE]: {
80
+ request: RequestableBuffer,
81
+ response: RequestableBuffer,
82
+ },
83
+ [ReqRespSubProtocol.BLOCK]: {
84
+ request: Fr, // block number
85
+ response: L2Block,
86
+ },
64
87
  };
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJbEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQztBQXlDckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFpQnpELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFpQztJQUMzRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGFBQWE7SUFDOUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxhQUFhO0lBQ2hDLENBQUMsZUFBZSxDQUFDLEVBQUUsYUFBYTtDQUNqQyxDQUFDO0FBVUY7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFTLEVBQW1CLEVBQUU7SUFDcEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUErQjtJQUN2RSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWM7SUFDL0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxjQUFjO0lBQ2pDLENBQUMsZUFBZSxDQUFDLEVBQUUsY0FBYztDQUNsQyxDQUFDO0FBaUJGOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUFtQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUFHLENBQUM7SUFFckMsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzlCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFtQjtJQUM1QyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ2YsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixRQUFRLEVBQUUsaUJBQWlCO0tBQzVCO0lBQ0QsQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNqQixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFFBQVEsRUFBRSxpQkFBaUI7S0FDNUI7SUFDRCxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsUUFBUSxFQUFFLEVBQUU7S0FDYjtDQUNGLENBQUMifQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUk5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcseUJBQXlCLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDO0FBRTNELE1BQU0sQ0FBTixJQUFZLGtCQU1YO0FBTkQsV0FBWSxrQkFBa0I7SUFDNUIsb0RBQW9CLENBQUE7SUFDcEIsd0RBQXdCLENBQUE7SUFDeEIsMERBQTBCLENBQUE7SUFDMUIsZ0RBQW9CLENBQUE7SUFDcEIsc0RBQTBCLENBQUE7QUFDNUIsQ0FBQyxFQU5XLGtCQUFrQixLQUFsQixrQkFBa0IsUUFNN0I7QUFzQ0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFpQnpELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFpQztJQUMzRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWE7SUFDeEMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhO0lBQzFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYTtJQUN0QyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWE7SUFDM0MsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhO0NBQzFDLENBQUM7QUFVRjs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQVMsRUFBbUIsRUFBRTtJQUNwRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQStCO0lBQ3ZFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYztJQUN6QyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjO0lBQ3ZDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYztJQUM1QyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWM7Q0FDM0MsQ0FBQztBQW9CRjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFBbUIsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7SUFBRyxDQUFDO0lBRXJDLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYztRQUM5QixPQUFPLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBbUI7SUFDNUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFFBQVEsRUFBRSxpQkFBaUI7S0FDNUI7SUFDRCxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzNCLE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsUUFBUSxFQUFFLGlCQUFpQjtLQUM1QjtJQUNELENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdkIsT0FBTyxFQUFFLE1BQU07UUFDZixRQUFRLEVBQUUsRUFBRTtLQUNiO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM1QixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLFFBQVEsRUFBRSxpQkFBaUI7S0FDNUI7SUFDRCxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzFCLE9BQU8sRUFBRSxFQUFFLEVBQUUsZUFBZTtRQUM1QixRQUFRLEVBQUUsT0FBTztLQUNsQjtDQUNGLENBQUMifQ==
@@ -0,0 +1,15 @@
1
+ import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
2
+ export declare class ReqRespMetrics {
3
+ readonly telemetryClient: TelemetryClient;
4
+ readonly tracer: Tracer;
5
+ private readonly sentRequests;
6
+ private readonly receivedRequests;
7
+ private readonly failedOutboundRequests;
8
+ private readonly failedInboundRequests;
9
+ constructor(telemetryClient: TelemetryClient, name?: string);
10
+ recordRequestSent(protocol: string): void;
11
+ recordRequestReceived(protocol: string): void;
12
+ recordRequestError(protocol: string): void;
13
+ recordResponseError(protocol: string): void;
14
+ }
15
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,yBAAyB,CAAC;AAEhG,qBAAa,cAAc;IASb,QAAQ,CAAC,eAAe,EAAE,eAAe;IARrD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IAEjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgB;gBAEjC,eAAe,EAAE,eAAe,EAAE,IAAI,SAAY;IA4BhE,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAIlC,qBAAqB,CAAC,QAAQ,EAAE,MAAM;IAItC,kBAAkB,CAAC,QAAQ,EAAE,MAAM;IAInC,mBAAmB,CAAC,QAAQ,EAAE,MAAM;CAG5C"}
@@ -0,0 +1,42 @@
1
+ // Request response metrics
2
+ import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
3
+ export class ReqRespMetrics {
4
+ constructor(telemetryClient, name = 'ReqResp') {
5
+ this.telemetryClient = telemetryClient;
6
+ this.tracer = telemetryClient.getTracer(name);
7
+ const meter = telemetryClient.getMeter(name);
8
+ this.sentRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_SENT_REQUESTS, {
9
+ description: 'Number of requests sent to peers',
10
+ unit: 'requests',
11
+ valueType: ValueType.INT,
12
+ });
13
+ this.receivedRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_RECEIVED_REQUESTS, {
14
+ description: 'Number of requests received from peers',
15
+ unit: 'requests',
16
+ valueType: ValueType.INT,
17
+ });
18
+ this.failedOutboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_OUTBOUND_REQUESTS, {
19
+ description: 'Number of failed outbound requests - nodes not getting valid responses',
20
+ unit: 'requests',
21
+ valueType: ValueType.INT,
22
+ });
23
+ this.failedInboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_INBOUND_REQUESTS, {
24
+ description: 'Number of failed inbound requests - node failing to respond to requests',
25
+ unit: 'requests',
26
+ valueType: ValueType.INT,
27
+ });
28
+ }
29
+ recordRequestSent(protocol) {
30
+ this.sentRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
31
+ }
32
+ recordRequestReceived(protocol) {
33
+ this.receivedRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
34
+ }
35
+ recordRequestError(protocol) {
36
+ this.failedOutboundRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
37
+ }
38
+ recordResponseError(protocol) {
39
+ this.failedInboundRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
40
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3pFLE1BQU0sT0FBTyxjQUFjO0lBU3pCLFlBQXFCLGVBQWdDLEVBQUUsSUFBSSxHQUFHLFNBQVM7UUFBbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRTtZQUNoRixXQUFXLEVBQUUsa0NBQWtDO1lBQy9DLElBQUksRUFBRSxVQUFVO1lBQ2hCLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRTtZQUN4RixXQUFXLEVBQUUsd0NBQXdDO1lBQ3JELElBQUksRUFBRSxVQUFVO1lBQ2hCLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsRUFBRTtZQUNyRyxXQUFXLEVBQUUsd0VBQXdFO1lBQ3JGLElBQUksRUFBRSxVQUFVO1lBQ2hCLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsRUFBRTtZQUNuRyxXQUFXLEVBQUUseUVBQXlFO1lBQ3RGLElBQUksRUFBRSxVQUFVO1lBQ2hCLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQUMsUUFBZ0I7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxRQUFnQjtRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU0sa0JBQWtCLENBQUMsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFFBQWdCO1FBQ3pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7Q0FDRiJ9
@@ -0,0 +1,4 @@
1
+ import { type L2BlockSource } from '@aztec/circuit-types';
2
+ import { type ReqRespSubProtocolHandler } from '../interface.js';
3
+ export declare function reqRespBlockHandler(l2BlockSource: L2BlockSource): ReqRespSubProtocolHandler;
4
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,yBAAyB,CAO3F"}
@@ -0,0 +1,9 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ export function reqRespBlockHandler(l2BlockSource) {
3
+ return async (_peerId, msg) => {
4
+ const blockNumber = Fr.fromBuffer(msg);
5
+ const foundBlock = await l2BlockSource.getBlock(Number(blockNumber));
6
+ return foundBlock ? foundBlock.toBuffer() : Buffer.alloc(0);
7
+ };
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9wcm90b2NvbHMvYmxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBTTlDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxhQUE0QjtJQUM5RCxPQUFPLEtBQUssRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDNUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUM7QUFDSixDQUFDIn0=
@@ -0,0 +1,51 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { type PeerId } from '@libp2p/interface';
4
+ import { type PeerManager } from '../../peer-manager/peer_manager.js';
5
+ import { type ReqRespSubProtocolHandler } from '../interface.js';
6
+ import { type ReqResp } from '../reqresp.js';
7
+ /**
8
+ * Enum defining the possible reasons for a goodbye message.
9
+ */
10
+ export declare enum GoodByeReason {
11
+ /** The peer has shutdown, will be received whenever a peer's node is routinely stopped */
12
+ SHUTDOWN = 1,
13
+ /** Whenever the peer must disconnect due to maintaining max peers */
14
+ DISCONNECTED = 2,
15
+ /** The peer has a low score, will be received whenever a peer's score is low */
16
+ LOW_SCORE = 3,
17
+ /** The peer has been banned, will be received whenever a peer is banned */
18
+ BANNED = 4,
19
+ /** Wrong network / fork */
20
+ WRONG_NETWORK = 5,
21
+ /** Unknown reason */
22
+ UNKNOWN = 6
23
+ }
24
+ export declare function encodeGoodbyeReason(reason: GoodByeReason): Buffer;
25
+ export declare function decodeGoodbyeReason(buffer: Buffer): GoodByeReason;
26
+ /**
27
+ * Pretty prints the goodbye reason.
28
+ * @param reason - The goodbye reason.
29
+ * @returns The pretty printed goodbye reason.
30
+ */
31
+ export declare function prettyGoodbyeReason(reason: GoodByeReason): string;
32
+ /**
33
+ * Handles a goodbye message request
34
+ */
35
+ export declare class GoodbyeProtocolHandler {
36
+ private reqresp;
37
+ private logger;
38
+ constructor(reqresp: ReqResp);
39
+ sendGoodbye(peerId: PeerId, reason: GoodByeReason): Promise<void>;
40
+ }
41
+ /**
42
+ * Handles the goodbye request. In request response, the goodbye request is handled by the peer manager.
43
+ *
44
+ * @dev Implemented as returning a function as the function is bound in the libp2p service, however
45
+ * its implementation is here to keep functionality together.
46
+ *
47
+ * @param peerManager - The peer manager.
48
+ * @returns A resolved promise with the goodbye response.
49
+ */
50
+ export declare function reqGoodbyeHandler(peerManager: PeerManager): ReqRespSubProtocolHandler;
51
+ //# sourceMappingURL=goodbye.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goodbye.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/goodbye.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAsB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,oBAAY,aAAa;IACvB,0FAA0F;IAC1F,QAAQ,IAAM;IACd,qEAAqE;IACrE,YAAY,IAAM;IAClB,gFAAgF;IAChF,SAAS,IAAM;IACf,2EAA2E;IAC3E,MAAM,IAAM;IACZ,2BAA2B;IAC3B,aAAa,IAAM;IACnB,qBAAqB;IACrB,OAAO,IAAM;CACd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CASjE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBjE;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,MAAM,CAAwC;gBAElC,OAAO,EAAE,OAAO;IAEvB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,yBAAyB,CASrF"}