@aztec/p2p 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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.
- package/dest/bootstrap/bootstrap.js +41 -29
- package/dest/client/factory.js +8 -10
- package/dest/client/index.js +0 -1
- package/dest/client/p2p_client.js +513 -507
- package/dest/config.js +44 -39
- package/dest/errors/reqresp.error.js +6 -10
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +64 -32
- package/dest/mem_pools/attestation_pool/index.js +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +22 -19
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +22 -26
- package/dest/mem_pools/attestation_pool/mocks.js +10 -6
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js +1 -2
- package/dest/mem_pools/epoch_proof_quote_pool/index.js +0 -1
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +5 -4
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.js +2 -3
- package/dest/mem_pools/index.js +1 -2
- package/dest/mem_pools/instrumentation.js +37 -42
- package/dest/mem_pools/interface.js +3 -2
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +127 -134
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +45 -43
- package/dest/mem_pools/tx_pool/priority.js +1 -3
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -2
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +107 -37
- package/dest/mocks/index.js +47 -38
- package/dest/msg_validators/attestation_validator/attestation_validator.js +3 -3
- package/dest/msg_validators/attestation_validator/index.js +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +2 -2
- package/dest/msg_validators/epoch_proof_quote_validator/index.js +0 -1
- package/dest/msg_validators/index.js +0 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +9 -11
- package/dest/msg_validators/tx_validator/block_header_validator.js +17 -12
- package/dest/msg_validators/tx_validator/data_validator.js +41 -32
- package/dest/msg_validators/tx_validator/double_spend_validator.js +22 -14
- package/dest/msg_validators/tx_validator/index.js +0 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +29 -26
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +17 -12
- package/dest/services/data_store.js +57 -57
- package/dest/services/discv5/discV5_service.js +31 -23
- package/dest/services/dummy_service.js +40 -58
- package/dest/services/encoding.js +10 -9
- package/dest/services/index.js +0 -1
- package/dest/services/libp2p/libp2p_service.js +709 -695
- package/dest/services/peer-manager/metrics.js +14 -7
- package/dest/services/peer-manager/peer_manager.js +340 -342
- package/dest/services/peer-manager/peer_scoring.js +20 -18
- package/dest/services/reqresp/config.js +4 -5
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +35 -28
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +60 -59
- package/dest/services/reqresp/index.js +1 -3
- package/dest/services/reqresp/interface.js +25 -30
- package/dest/services/reqresp/metrics.js +23 -10
- package/dest/services/reqresp/protocols/block.js +1 -2
- package/dest/services/reqresp/protocols/goodbye.js +35 -40
- package/dest/services/reqresp/protocols/index.js +1 -3
- package/dest/services/reqresp/protocols/ping.js +1 -3
- package/dest/services/reqresp/protocols/status.js +1 -3
- package/dest/services/reqresp/protocols/tx.js +5 -8
- package/dest/services/reqresp/rate-limiter/index.js +0 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +42 -36
- package/dest/services/reqresp/rate-limiter/rate_limits.js +16 -17
- package/dest/services/reqresp/reqresp.js +461 -395
- package/dest/services/reqresp/status.js +51 -0
- package/dest/services/service.js +3 -4
- package/dest/services/types.js +16 -23
- package/dest/util.js +23 -34
- package/package.json +8 -8
- package/src/client/p2p_client.ts +159 -125
- package/src/mem_pools/index.ts +3 -3
- package/src/mem_pools/instrumentation.ts +3 -2
- package/src/services/reqresp/interface.ts +11 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +3 -1
- package/src/services/reqresp/rate-limiter/rate_limits.ts +2 -2
- package/src/services/reqresp/reqresp.ts +111 -24
- package/src/services/reqresp/status.ts +59 -0
- package/dest/bootstrap/bootstrap.d.ts +0 -38
- package/dest/bootstrap/bootstrap.d.ts.map +0 -1
- package/dest/client/factory.d.ts +0 -19
- package/dest/client/factory.d.ts.map +0 -1
- package/dest/client/index.d.ts +0 -3
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/p2p_client.d.ts +0 -321
- package/dest/client/p2p_client.d.ts.map +0 -1
- package/dest/config.d.ts +0 -171
- package/dest/config.d.ts.map +0 -1
- package/dest/errors/reqresp.error.d.ts +0 -28
- package/dest/errors/reqresp.error.d.ts.map +0 -1
- package/dest/index.d.ts +0 -9
- package/dest/index.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +0 -57
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +0 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/index.d.ts +0 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +0 -18
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +0 -1
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts +0 -7
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts.map +0 -1
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts +0 -4
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +0 -12
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +0 -1
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts +0 -8
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts.map +0 -1
- package/dest/mem_pools/index.d.ts +0 -5
- package/dest/mem_pools/index.d.ts.map +0 -1
- package/dest/mem_pools/instrumentation.d.ts +0 -31
- package/dest/mem_pools/instrumentation.d.ts.map +0 -1
- package/dest/mem_pools/interface.d.ts +0 -13
- package/dest/mem_pools/interface.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -66
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.d.ts +0 -4
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -66
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mocks/index.d.ts +0 -54
- package/dest/mocks/index.d.ts.map +0 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +0 -8
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +0 -1
- package/dest/msg_validators/attestation_validator/index.d.ts +0 -2
- package/dest/msg_validators/attestation_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +0 -8
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +0 -1
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +0 -2
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/index.d.ts +0 -4
- package/dest/msg_validators/index.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +0 -7
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +0 -11
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts +0 -6
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +0 -12
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/index.d.ts +0 -7
- package/dest/msg_validators/tx_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +0 -10
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +0 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +0 -8
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +0 -1
- package/dest/services/data_store.d.ts +0 -27
- package/dest/services/data_store.d.ts.map +0 -1
- package/dest/services/discv5/discV5_service.d.ts +0 -36
- package/dest/services/discv5/discV5_service.d.ts.map +0 -1
- package/dest/services/dummy_service.d.ts +0 -82
- package/dest/services/dummy_service.d.ts.map +0 -1
- package/dest/services/encoding.d.ts +0 -31
- package/dest/services/encoding.d.ts.map +0 -1
- package/dest/services/index.d.ts +0 -3
- package/dest/services/index.d.ts.map +0 -1
- package/dest/services/libp2p/libp2p_service.d.ts +0 -225
- package/dest/services/libp2p/libp2p_service.d.ts.map +0 -1
- package/dest/services/peer-manager/metrics.d.ts +0 -12
- package/dest/services/peer-manager/metrics.d.ts.map +0 -1
- package/dest/services/peer-manager/peer_manager.d.ts +0 -76
- package/dest/services/peer-manager/peer_manager.d.ts.map +0 -1
- package/dest/services/peer-manager/peer_scoring.d.ts +0 -28
- package/dest/services/peer-manager/peer_scoring.d.ts.map +0 -1
- package/dest/services/reqresp/config.d.ts +0 -16
- package/dest/services/reqresp/config.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +0 -61
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/index.d.ts +0 -6
- package/dest/services/reqresp/index.d.ts.map +0 -1
- package/dest/services/reqresp/interface.d.ts +0 -107
- package/dest/services/reqresp/interface.d.ts.map +0 -1
- package/dest/services/reqresp/metrics.d.ts +0 -15
- package/dest/services/reqresp/metrics.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.d.ts +0 -4
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +0 -51
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/index.d.ts +0 -9
- package/dest/services/reqresp/protocols/index.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/ping.d.ts +0 -9
- package/dest/services/reqresp/protocols/ping.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/status.d.ts +0 -9
- package/dest/services/reqresp/protocols/status.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +0 -13
- package/dest/services/reqresp/protocols/tx.d.ts.map +0 -1
- package/dest/services/reqresp/rate-limiter/index.d.ts +0 -2
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +0 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +0 -102
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +0 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +0 -3
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +0 -1
- package/dest/services/reqresp/reqresp.d.ts +0 -161
- package/dest/services/reqresp/reqresp.d.ts.map +0 -1
- package/dest/services/service.d.ts +0 -85
- package/dest/services/service.d.ts.map +0 -1
- package/dest/services/types.d.ts +0 -38
- package/dest/services/types.d.ts.map +0 -1
- package/dest/util.d.ts +0 -53
- package/dest/util.d.ts.map +0 -1
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
4
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
-
import { type PeerId } from '@libp2p/interface';
|
|
6
|
-
import { type Libp2p } from 'libp2p';
|
|
7
|
-
import { type PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
8
|
-
import { type P2PReqRespConfig } from './config.js';
|
|
9
|
-
import { type ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type ReqRespSubProtocolValidators, type SubProtocolMap } from './interface.js';
|
|
10
|
-
/**
|
|
11
|
-
* The Request Response Service
|
|
12
|
-
*
|
|
13
|
-
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
14
|
-
* information that was missed during a syncronisation or a gossip event.
|
|
15
|
-
*
|
|
16
|
-
* This service implements the request response sub protocol, it is heavily inspired from
|
|
17
|
-
* ethereum implementations of the same name.
|
|
18
|
-
*
|
|
19
|
-
* Note, responses get compressed in streamHandler
|
|
20
|
-
* so they get decompressed in readMessage
|
|
21
|
-
*
|
|
22
|
-
* see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
|
|
23
|
-
*/
|
|
24
|
-
export declare class ReqResp {
|
|
25
|
-
private libp2p;
|
|
26
|
-
private peerScoring;
|
|
27
|
-
protected readonly logger: Logger;
|
|
28
|
-
private overallRequestTimeoutMs;
|
|
29
|
-
private individualRequestTimeoutMs;
|
|
30
|
-
private subProtocolHandlers;
|
|
31
|
-
private subProtocolValidators;
|
|
32
|
-
private connectionSampler;
|
|
33
|
-
private rateLimiter;
|
|
34
|
-
private snappyTransform;
|
|
35
|
-
private metrics;
|
|
36
|
-
constructor(config: P2PReqRespConfig, libp2p: Libp2p, peerScoring: PeerScoring, telemetryClient?: TelemetryClient);
|
|
37
|
-
get tracer(): import("@aztec/telemetry-client").Tracer;
|
|
38
|
-
/**
|
|
39
|
-
* Start the reqresp service
|
|
40
|
-
*/
|
|
41
|
-
start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators): Promise<void>;
|
|
42
|
-
/**
|
|
43
|
-
* Stop the reqresp service
|
|
44
|
-
*/
|
|
45
|
-
stop(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Send a request to peers, returns the first response
|
|
48
|
-
*
|
|
49
|
-
* @param subProtocol - The protocol being requested
|
|
50
|
-
* @param request - The request to send
|
|
51
|
-
* @returns - The response from the peer, otherwise undefined
|
|
52
|
-
*
|
|
53
|
-
* @description
|
|
54
|
-
* This method attempts to send a request to all active peers using the specified sub-protocol.
|
|
55
|
-
* It opens a stream with each peer, sends the request, and awaits a response.
|
|
56
|
-
* If a valid response is received, it returns the response; otherwise, it continues to the next peer.
|
|
57
|
-
* If no response is received from any peer, it returns undefined.
|
|
58
|
-
*
|
|
59
|
-
* The method performs the following steps:
|
|
60
|
-
* - Sample a peer to send the request to.
|
|
61
|
-
* - Opens a stream with the peer using the specified sub-protocol.
|
|
62
|
-
*
|
|
63
|
-
* When a response is received, it is validated using the given sub protocols response validator.
|
|
64
|
-
* To see the interface for the response validator - see `interface.ts`
|
|
65
|
-
*
|
|
66
|
-
* Failing a response validation requests in a severe peer penalty, and will
|
|
67
|
-
* prompt the node to continue to search to the next peer.
|
|
68
|
-
* For example, a transaction request validator will check that the payload returned does in fact
|
|
69
|
-
* match the txHash that was requested. A peer that fails this check an only be an extremely naughty peer.
|
|
70
|
-
*
|
|
71
|
-
* This entire operation is wrapped in an overall timeout, that is independent of the
|
|
72
|
-
* peer it is requesting data from.
|
|
73
|
-
*
|
|
74
|
-
*/
|
|
75
|
-
sendRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, request: InstanceType<SubProtocolMap[SubProtocol]['request']>): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined>;
|
|
76
|
-
/**
|
|
77
|
-
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
78
|
-
*
|
|
79
|
-
* @devnote
|
|
80
|
-
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
81
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
82
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
83
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
84
|
-
*
|
|
85
|
-
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
86
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
87
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
88
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
89
|
-
*
|
|
90
|
-
* @param subProtocol
|
|
91
|
-
* @param requests
|
|
92
|
-
* @param timeoutMs
|
|
93
|
-
* @param maxPeers
|
|
94
|
-
* @returns
|
|
95
|
-
*
|
|
96
|
-
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
97
|
-
*/
|
|
98
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(subProtocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
99
|
-
/**
|
|
100
|
-
* Sends a request to a specific peer
|
|
101
|
-
*
|
|
102
|
-
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
103
|
-
* what to respond with
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* @param peerId - The peer to send the request to
|
|
107
|
-
* @param subProtocol - The protocol to use to request
|
|
108
|
-
* @param payload - The payload to send
|
|
109
|
-
* @returns If the request is successful, the response is returned, otherwise undefined
|
|
110
|
-
*
|
|
111
|
-
* @description
|
|
112
|
-
* This method attempts to open a stream with the specified peer, send the payload,
|
|
113
|
-
* and await a response.
|
|
114
|
-
* If an error occurs, it penalizes the peer and returns undefined.
|
|
115
|
-
*
|
|
116
|
-
* The method performs the following steps:
|
|
117
|
-
* - Opens a stream with the peer using the specified sub-protocol.
|
|
118
|
-
* - Sends the payload and awaits a response with a timeout.
|
|
119
|
-
*
|
|
120
|
-
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
121
|
-
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
122
|
-
*/
|
|
123
|
-
sendRequestToPeer(peerId: PeerId, subProtocol: ReqRespSubProtocol, payload: Buffer): Promise<Buffer | undefined>;
|
|
124
|
-
/**
|
|
125
|
-
* Handle a response error
|
|
126
|
-
*
|
|
127
|
-
* ReqResp errors are punished differently depending on the severity of the offense
|
|
128
|
-
*
|
|
129
|
-
* @param e - The error
|
|
130
|
-
* @param peerId - The peer id
|
|
131
|
-
* @param subProtocol - The sub protocol
|
|
132
|
-
* @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
|
|
133
|
-
*/
|
|
134
|
-
private handleResponseError;
|
|
135
|
-
/**
|
|
136
|
-
* Categorize the error and log it.
|
|
137
|
-
*/
|
|
138
|
-
private categorizeError;
|
|
139
|
-
/**
|
|
140
|
-
* Read a message returned from a stream into a single buffer
|
|
141
|
-
*/
|
|
142
|
-
private readMessage;
|
|
143
|
-
/**
|
|
144
|
-
* Stream Handler
|
|
145
|
-
* Reads the incoming stream, determines the protocol, then triggers the appropriate handler
|
|
146
|
-
*
|
|
147
|
-
* @param param0 - The incoming stream data
|
|
148
|
-
*
|
|
149
|
-
* @description
|
|
150
|
-
* An individual stream handler will be bound to each sub protocol, and handles returning data back
|
|
151
|
-
* to the requesting peer.
|
|
152
|
-
*
|
|
153
|
-
* The sub protocol handler interface is defined within `interface.ts` and will be assigned to the
|
|
154
|
-
* req resp service on start up.
|
|
155
|
-
*
|
|
156
|
-
* We check rate limits for each peer, note the peer will be penalised within the rate limiter implementation
|
|
157
|
-
* if they exceed their peer specific limits.
|
|
158
|
-
*/
|
|
159
|
-
private streamHandler;
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=reqresp.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reqresp.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/reqresp.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAc,KAAK,eAAe,EAAiC,MAAM,yBAAyB,CAAC;AAE1G,OAAO,EAA2B,KAAK,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAEtF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AASrC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AAIxB;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO;IAmBhB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IAnBrB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,0BAA0B,CAAS;IAG3C,OAAO,CAAC,mBAAmB,CAA6D;IACxF,OAAO,CAAC,qBAAqB,CAAiE;IAE9F,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,OAAO,CAAiB;gBAG9B,MAAM,EAAE,gBAAgB,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EAChC,eAAe,GAAE,eAAsC;IAgBzD,IAAI,MAAM,6CAET;IAED;;OAEG;IACG,KAAK,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,4BAA4B;IAiBhH;;OAEG;IACG,IAAI;IAoBV;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,WAAW,CAAC,WAAW,SAAS,kBAAkB,EACtD,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,GAC5D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IAuD7E;;;;;;;;;;;;;;;;;;;;;OAqBG;IAQG,gBAAgB,CAAC,WAAW,SAAS,kBAAkB,EAC3D,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAChE,SAAS,SAAQ,EACjB,QAAQ,SAAgC,EACxC,gBAAgB,SAAI,GACnB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IA+GnE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IAKU,iBAAiB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAgC9B;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,eAAe;IA4CvB;;OAEG;YACW,WAAW;IASzB;;;;;;;;;;;;;;;OAeG;YAKW,aAAa;CAkC5B"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import type { BlockAttestation, BlockProposal, Gossipable, PeerInfo } from '@aztec/circuit-types';
|
|
3
|
-
import type { ENR } from '@chainsafe/enr';
|
|
4
|
-
import type { PeerId } from '@libp2p/interface';
|
|
5
|
-
import type EventEmitter from 'events';
|
|
6
|
-
import { type ReqRespSubProtocol, type SubProtocolMap } from './reqresp/interface.js';
|
|
7
|
-
export declare enum PeerDiscoveryState {
|
|
8
|
-
RUNNING = "running",
|
|
9
|
-
STOPPED = "stopped"
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* The interface for a P2P service implementation.
|
|
13
|
-
*/
|
|
14
|
-
export interface P2PService {
|
|
15
|
-
/**
|
|
16
|
-
* Starts the service.
|
|
17
|
-
* @returns An empty promise.
|
|
18
|
-
*/
|
|
19
|
-
start(): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Stops the service.
|
|
22
|
-
* @returns An empty promise.
|
|
23
|
-
*/
|
|
24
|
-
stop(): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* Called to have the given transaction propagated through the P2P network.
|
|
27
|
-
* @param message - The message to be propagated.
|
|
28
|
-
*/
|
|
29
|
-
propagate<T extends Gossipable>(message: T): void;
|
|
30
|
-
/**
|
|
31
|
-
* Request information from peers via the request response protocol.
|
|
32
|
-
*
|
|
33
|
-
* @param protocol - The request response protocol to use
|
|
34
|
-
* @param request - The request type, corresponding to the protocol
|
|
35
|
-
* @returns The response type, corresponding to the protocol
|
|
36
|
-
*/
|
|
37
|
-
sendRequest<Protocol extends ReqRespSubProtocol>(protocol: Protocol, request: InstanceType<SubProtocolMap[Protocol]['request']>): Promise<InstanceType<SubProtocolMap[Protocol]['response']> | undefined>;
|
|
38
|
-
/**
|
|
39
|
-
* Send a batch of requests to peers, and return the responses
|
|
40
|
-
*
|
|
41
|
-
* @param protocol - The request response protocol to use
|
|
42
|
-
* @param requests - The requests to send to the peers
|
|
43
|
-
* @returns The responses to the requests
|
|
44
|
-
*/
|
|
45
|
-
sendBatchRequest<Protocol extends ReqRespSubProtocol>(protocol: Protocol, requests: InstanceType<SubProtocolMap[Protocol]['request']>[]): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[] | undefined>;
|
|
46
|
-
registerBlockReceivedCallback(callback: (block: BlockProposal) => Promise<BlockAttestation | undefined>): void;
|
|
47
|
-
getEnr(): ENR | undefined;
|
|
48
|
-
getPeers(includePending?: boolean): PeerInfo[];
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* The interface for a peer discovery service implementation.
|
|
52
|
-
*/
|
|
53
|
-
export interface PeerDiscoveryService extends EventEmitter {
|
|
54
|
-
/**
|
|
55
|
-
* Starts the service.
|
|
56
|
-
* */
|
|
57
|
-
start(): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Stops the service.
|
|
60
|
-
* */
|
|
61
|
-
stop(): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
* Gets all peers.
|
|
64
|
-
* @returns An array of peer ENRs.
|
|
65
|
-
*/
|
|
66
|
-
getAllPeers(): ENR[];
|
|
67
|
-
/**
|
|
68
|
-
* Runs findRandomNode query.
|
|
69
|
-
*/
|
|
70
|
-
runRandomNodesQuery(): Promise<void>;
|
|
71
|
-
/**
|
|
72
|
-
* Checks if the given peer is a bootstrap peer.
|
|
73
|
-
* @param peerId - The peer ID to check.
|
|
74
|
-
* @returns True if the peer is a bootstrap peer.
|
|
75
|
-
*/
|
|
76
|
-
isBootstrapPeer(peerId: PeerId): boolean;
|
|
77
|
-
/**
|
|
78
|
-
* Event emitted when a new peer is discovered.
|
|
79
|
-
*/
|
|
80
|
-
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
|
|
81
|
-
emit(event: 'peer:discovered', enr: ENR): boolean;
|
|
82
|
-
getStatus(): PeerDiscoveryState;
|
|
83
|
-
getEnr(): ENR | undefined;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAElG,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEtF,oBAAY,kBAAkB;IAC5B,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAElD;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EAC7C,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GACzD,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAE3E;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,SAAS,kBAAkB,EAClD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAC5D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IAG7E,6BAA6B,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IAE/G,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;IAE1B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;SAEK;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;SAEK;IACL,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,WAAW,IAAI,GAAG,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD,SAAS,IAAI,kBAAkB,CAAC;IAEhC,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC;CAC3B"}
|
package/dest/services/types.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/***************************************************
|
|
2
|
-
* Events
|
|
3
|
-
***************************************************/
|
|
4
|
-
/**
|
|
5
|
-
* Events emitted from the libp2p node.
|
|
6
|
-
*/
|
|
7
|
-
export declare enum PeerEvent {
|
|
8
|
-
DISCOVERED = "peer:discovered",
|
|
9
|
-
CONNECTED = "peer:connect",
|
|
10
|
-
DISCONNECTED = "peer:disconnect"
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Events emitted from the Discv5 service.
|
|
14
|
-
*/
|
|
15
|
-
export declare enum Discv5Event {
|
|
16
|
-
DISCOVERED = "discovered",
|
|
17
|
-
ENR_ADDED = "enrAdded"
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Events emitted from the GossipSub protocol.
|
|
21
|
-
*/
|
|
22
|
-
export declare enum GossipSubEvent {
|
|
23
|
-
MESSAGE = "gossipsub:message"
|
|
24
|
-
}
|
|
25
|
-
/***************************************************
|
|
26
|
-
* Types
|
|
27
|
-
***************************************************/
|
|
28
|
-
/**
|
|
29
|
-
* Aztec network specific types
|
|
30
|
-
*/
|
|
31
|
-
export declare const AZTEC_ENR_KEY = "aztec_network";
|
|
32
|
-
export declare enum AztecENR {
|
|
33
|
-
devnet = 1,
|
|
34
|
-
testnet = 2,
|
|
35
|
-
mainnet = 3
|
|
36
|
-
}
|
|
37
|
-
export declare const AZTEC_NET = AztecENR.devnet;
|
|
38
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":"AAAA;;qDAEqD;AAErD;;GAEG;AACH,oBAAY,SAAS;IACnB,UAAU,oBAAoB;IAC9B,SAAS,iBAAiB;IAC1B,YAAY,oBAAoB;CACjC;AAED;;GAEG;AACH,oBAAY,WAAW;IACrB,UAAU,eAAe;IACzB,SAAS,aAAa;CACvB;AAED;;GAEG;AACH,oBAAY,cAAc;IACxB,OAAO,sBAAsB;CAC9B;AAED;;qDAEqD;AACrD;;GAEG;AACH,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,oBAAY,QAAQ;IAClB,MAAM,IAAO;IACb,OAAO,IAAO;IACd,OAAO,IAAO;CACf;AAGD,eAAO,MAAM,SAAS,kBAAkB,CAAC"}
|
package/dest/util.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { type AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
|
-
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
|
-
import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
|
|
4
|
-
import { type PeerId } from '@libp2p/interface';
|
|
5
|
-
import { type ConnectionManager } from '@libp2p/interface-internal';
|
|
6
|
-
import type { Libp2p } from 'libp2p';
|
|
7
|
-
import { type P2PConfig } from './config.js';
|
|
8
|
-
export interface PubSubLibp2p extends Libp2p {
|
|
9
|
-
services: {
|
|
10
|
-
pubsub: GossipSub;
|
|
11
|
-
components: {
|
|
12
|
-
connectionManager: ConnectionManager;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Converts an address string to a multiaddr string.
|
|
18
|
-
* Example usage:
|
|
19
|
-
* const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
|
|
20
|
-
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
21
|
-
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
22
|
-
* @param protocol - The protocol to use in the multiaddr string.
|
|
23
|
-
* @returns A multiaddr compliant string. */
|
|
24
|
-
export declare function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string;
|
|
25
|
-
/**
|
|
26
|
-
* Splits an <address>:<port> string into its components.
|
|
27
|
-
* @returns The ip6 or ip4 address & port separately
|
|
28
|
-
*/
|
|
29
|
-
export declare function splitAddressPort(address: string, allowEmptyAddress: boolean): [string, string];
|
|
30
|
-
/**
|
|
31
|
-
* Queries the public IP address of the machine.
|
|
32
|
-
*/
|
|
33
|
-
export declare function getPublicIp(): Promise<string>;
|
|
34
|
-
export declare function resolveAddressIfNecessary(address: string): Promise<string>;
|
|
35
|
-
export declare function configureP2PClientAddresses(_config: P2PConfig & DataStoreConfig): Promise<P2PConfig & DataStoreConfig>;
|
|
36
|
-
/**
|
|
37
|
-
* Get the peer id private key
|
|
38
|
-
*
|
|
39
|
-
* 1. Check if we have a peer id private key in the config
|
|
40
|
-
* 2. If not, check we have a peer id private key persisted in the node
|
|
41
|
-
* 3. If not, create a new one, then persist it in the node
|
|
42
|
-
*
|
|
43
|
-
*/
|
|
44
|
-
export declare function getPeerIdPrivateKey(config: {
|
|
45
|
-
peerIdPrivateKey?: string;
|
|
46
|
-
}, store: AztecAsyncKVStore): Promise<string>;
|
|
47
|
-
/**
|
|
48
|
-
* Create a libp2p peer ID from the private key.
|
|
49
|
-
* @param privateKey - peer ID private key as hex string
|
|
50
|
-
* @returns The peer ID.
|
|
51
|
-
*/
|
|
52
|
-
export declare function createLibP2PPeerIdFromPrivateKey(privateKey: string): Promise<PeerId>;
|
|
53
|
-
//# sourceMappingURL=util.d.ts.map
|
package/dest/util.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,SAAS,CAAC;QAClB,UAAU,EAAE;YACV,iBAAiB,EAAE,iBAAiB,CAAC;SACtC,CAAC;KACH,CAAC;CACH;AAED;;;;;;;6CAO6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CASnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhF;AAcD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,SAAS,GAAG,eAAe,GACnC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,CA6CtC;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED;;;;GAIG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1F"}
|