@aztec/p2p 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.0
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.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +31 -38
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +13 -11
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +1 -0
- package/dest/client/p2p_client.d.ts +332 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +535 -513
- package/dest/config.d.ts +187 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +64 -53
- package/dest/errors/reqresp.error.d.ts +28 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +10 -6
- package/dest/index.d.ts +9 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +2 -6
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +32 -64
- package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +19 -22
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +26 -22
- package/dest/mem_pools/attestation_pool/mocks.d.ts +18 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +6 -10
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts +7 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js +2 -1
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts +4 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.js +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +12 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +4 -5
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts +8 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.js +3 -2
- package/dest/mem_pools/index.d.ts +5 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +2 -1
- package/dest/mem_pools/instrumentation.d.ts +31 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +42 -37
- package/dest/mem_pools/interface.d.ts +13 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +2 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +134 -127
- package/dest/mem_pools/tx_pool/index.d.ts +4 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +1 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +43 -45
- package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +3 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +2 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +37 -107
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +3 -3
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/index.js +1 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +2 -2
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -9
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +12 -17
- package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +32 -41
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +14 -22
- package/dest/msg_validators/tx_validator/index.d.ts +7 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +26 -29
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +12 -17
- package/dest/services/data_store.d.ts +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +57 -57
- package/dest/services/discv5/discV5_service.d.ts +40 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +82 -43
- package/dest/services/dummy_service.d.ts +83 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +59 -40
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +9 -10
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/libp2p_logger.d.ts +7 -0
- package/dest/services/libp2p/libp2p_logger.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_logger.js +67 -0
- package/dest/services/libp2p/libp2p_service.d.ts +225 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +727 -709
- package/dest/services/peer-manager/metrics.d.ts +12 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +7 -14
- package/dest/services/peer-manager/peer_manager.d.ts +76 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +342 -340
- package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +18 -20
- package/dest/services/reqresp/config.d.ts +16 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +5 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +28 -35
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +59 -60
- package/dest/services/reqresp/index.d.ts +6 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +3 -1
- package/dest/services/reqresp/interface.d.ts +116 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +30 -25
- package/dest/services/reqresp/metrics.d.ts +15 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +10 -23
- package/dest/services/reqresp/protocols/block.d.ts +4 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block.js +2 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +41 -36
- package/dest/services/reqresp/protocols/index.d.ts +9 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +3 -1
- package/dest/services/reqresp/protocols/ping.d.ts +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +3 -1
- package/dest/services/reqresp/protocols/status.d.ts +9 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +3 -1
- package/dest/services/reqresp/protocols/tx.d.ts +13 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +8 -5
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +35 -39
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +17 -16
- package/dest/services/reqresp/reqresp.d.ts +166 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +463 -460
- package/dest/services/reqresp/status.d.ts +31 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +17 -16
- package/dest/services/service.d.ts +86 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +4 -3
- package/dest/services/types.d.ts +32 -0
- package/dest/services/types.d.ts.map +1 -0
- package/dest/services/types.js +19 -20
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +15 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +6 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +6 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +35 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +37 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +71 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +55 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +183 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +125 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +34 -23
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +38 -0
- package/package.json +11 -9
- package/src/bootstrap/bootstrap.ts +9 -3
- package/src/client/factory.ts +12 -5
- package/src/config.ts +56 -29
- package/src/mem_pools/index.ts +3 -3
- package/src/mem_pools/instrumentation.ts +2 -3
- package/src/msg_validators/attestation_validator/attestation_validator.ts +3 -3
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +3 -3
- package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +3 -3
- package/src/services/discv5/discV5_service.ts +67 -18
- package/src/services/dummy_service.ts +2 -0
- package/src/services/libp2p/libp2p_logger.ts +78 -0
- package/src/services/libp2p/libp2p_service.ts +47 -10
- package/src/services/reqresp/protocols/goodbye.ts +1 -1
- package/src/services/reqresp/reqresp.ts +9 -1
- package/src/services/service.ts +2 -0
- package/src/services/types.ts +2 -10
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +5 -0
- package/src/test-helpers/make-enrs.ts +44 -0
- package/src/test-helpers/make-test-p2p-clients.ts +124 -0
- package/src/{mocks/index.ts → test-helpers/reqresp-nodes.ts} +10 -5
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +156 -0
- package/src/testbench/scripts/run_testbench.sh +7 -0
- package/src/versioning.ts +50 -0
- package/dest/mocks/index.js +0 -190
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PeerErrorSeverity } from '@aztec/circuit-types';
|
|
2
|
+
import { type PeerId } from '@libp2p/interface';
|
|
3
|
+
import { type P2PConfig } from '../../config.js';
|
|
4
|
+
export declare enum PeerScoreState {
|
|
5
|
+
Banned = 0,
|
|
6
|
+
Disconnect = 1,
|
|
7
|
+
Healthy = 2
|
|
8
|
+
}
|
|
9
|
+
export declare class PeerScoring {
|
|
10
|
+
private logger;
|
|
11
|
+
private scores;
|
|
12
|
+
private lastUpdateTime;
|
|
13
|
+
private decayInterval;
|
|
14
|
+
private decayFactor;
|
|
15
|
+
peerPenalties: {
|
|
16
|
+
[key in PeerErrorSeverity]: number;
|
|
17
|
+
};
|
|
18
|
+
constructor(config: P2PConfig);
|
|
19
|
+
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): number;
|
|
20
|
+
updateScore(peerId: string, scoreDelta: number): number;
|
|
21
|
+
decayAllScores(): void;
|
|
22
|
+
getScore(peerId: string): number;
|
|
23
|
+
getScoreState(peerId: string): PeerScoreState;
|
|
24
|
+
getStats(): {
|
|
25
|
+
medianScore: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=peer_scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAO;IAC1B,aAAa,EAAE;SAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;KAAE,CAAC;gBAE1C,MAAM,EAAE,SAAS;IAYtB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAQ9D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAmBvD,cAAc,IAAI,IAAI;IActB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAYpD,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;CAGpC"}
|
|
@@ -4,30 +4,29 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
const DefaultPeerPenalties = {
|
|
5
5
|
[PeerErrorSeverity.LowToleranceError]: 50,
|
|
6
6
|
[PeerErrorSeverity.MidToleranceError]: 10,
|
|
7
|
-
[PeerErrorSeverity.HighToleranceError]: 2
|
|
7
|
+
[PeerErrorSeverity.HighToleranceError]: 2,
|
|
8
8
|
};
|
|
9
|
-
export var PeerScoreState
|
|
9
|
+
export var PeerScoreState;
|
|
10
|
+
(function (PeerScoreState) {
|
|
10
11
|
PeerScoreState[PeerScoreState["Banned"] = 0] = "Banned";
|
|
11
12
|
PeerScoreState[PeerScoreState["Disconnect"] = 1] = "Disconnect";
|
|
12
13
|
PeerScoreState[PeerScoreState["Healthy"] = 2] = "Healthy";
|
|
13
|
-
|
|
14
|
-
}({});
|
|
14
|
+
})(PeerScoreState || (PeerScoreState = {}));
|
|
15
15
|
// TODO: move into config / constants
|
|
16
16
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
17
17
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
18
18
|
export class PeerScoring {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const orderedValues = config.peerPenaltyValues?.sort((a, b)=>a - b);
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.logger = createLogger('p2p:peer-scoring');
|
|
21
|
+
this.scores = new Map();
|
|
22
|
+
this.lastUpdateTime = new Map();
|
|
23
|
+
this.decayInterval = 1000 * 60; // 1 minute
|
|
24
|
+
this.decayFactor = 0.9;
|
|
25
|
+
const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
|
|
27
26
|
this.peerPenalties = {
|
|
28
27
|
[PeerErrorSeverity.HighToleranceError]: orderedValues?.[0] ?? DefaultPeerPenalties[PeerErrorSeverity.HighToleranceError],
|
|
29
28
|
[PeerErrorSeverity.MidToleranceError]: orderedValues?.[1] ?? DefaultPeerPenalties[PeerErrorSeverity.MidToleranceError],
|
|
30
|
-
[PeerErrorSeverity.LowToleranceError]: orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError]
|
|
29
|
+
[PeerErrorSeverity.LowToleranceError]: orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
|
|
31
30
|
};
|
|
32
31
|
}
|
|
33
32
|
penalizePeer(peerId, penalty) {
|
|
@@ -53,7 +52,7 @@ export class PeerScoring {
|
|
|
53
52
|
}
|
|
54
53
|
decayAllScores() {
|
|
55
54
|
const currentTime = Date.now();
|
|
56
|
-
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()){
|
|
55
|
+
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
|
|
57
56
|
const timePassed = currentTime - lastUpdate;
|
|
58
57
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
59
58
|
if (decayPeriods > 0) {
|
|
@@ -71,16 +70,15 @@ export class PeerScoring {
|
|
|
71
70
|
// TODO(#11329): permanently store banned peers?
|
|
72
71
|
const score = this.getScore(peerId);
|
|
73
72
|
if (score < MIN_SCORE_BEFORE_BAN) {
|
|
74
|
-
return
|
|
73
|
+
return PeerScoreState.Banned;
|
|
75
74
|
}
|
|
76
75
|
if (score < MIN_SCORE_BEFORE_DISCONNECT) {
|
|
77
|
-
return
|
|
76
|
+
return PeerScoreState.Disconnect;
|
|
78
77
|
}
|
|
79
|
-
return
|
|
78
|
+
return PeerScoreState.Healthy;
|
|
80
79
|
}
|
|
81
80
|
getStats() {
|
|
82
|
-
return {
|
|
83
|
-
medianScore: median(Array.from(this.scores.values())) ?? 0
|
|
84
|
-
};
|
|
81
|
+
return { medianScore: median(Array.from(this.scores.values())) ?? 0 };
|
|
85
82
|
}
|
|
86
83
|
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXItbWFuYWdlci9wZWVyX3Njb3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU1yRCxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFO0lBQ3pDLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFO0lBQ3pDLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO0NBQzFDLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVEQUFNLENBQUE7SUFDTiwrREFBVSxDQUFBO0lBQ1YseURBQU8sQ0FBQTtBQUNULENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUVELHFDQUFxQztBQUNyQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFFeEMsTUFBTSxPQUFPLFdBQVc7SUFRdEIsWUFBWSxNQUFpQjtRQVByQixXQUFNLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUMsV0FBTSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLG1CQUFjLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEQsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVztRQUN0QyxnQkFBVyxHQUFHLEdBQUcsQ0FBQztRQUl4QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNwQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEVBQ25DLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDO1lBQ2pGLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsRUFDbkMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7U0FDbEYsQ0FBQztJQUNKLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBYyxFQUFFLE9BQTBCO1FBQzVELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxPQUFPLGtCQUFrQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYyxFQUFFLFVBQWtCO1FBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUM7UUFDbEUsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFakUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELGNBQWM7UUFDZCxZQUFZLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXpELHdCQUF3QjtRQUN4QixZQUFZLElBQUksVUFBVSxDQUFDO1FBRTNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDN0MsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELGNBQWM7UUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxNQUFNLFVBQVUsR0FBRyxXQUFXLEdBQUcsVUFBVSxDQUFDO1lBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRSxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsTUFBYztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sYUFBYSxDQUFDLE1BQWM7UUFDakMsZ0RBQWdEO1FBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztZQUNqQyxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLDJCQUEyQixFQUFFLENBQUM7WUFDeEMsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3hFLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ConfigMapping } from '@aztec/foundation/config';
|
|
2
|
+
export declare const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 2000;
|
|
3
|
+
export declare const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 4000;
|
|
4
|
+
export declare const DEFAULT_P2P_REQRESP_CONFIG: P2PReqRespConfig;
|
|
5
|
+
export interface P2PReqRespConfig {
|
|
6
|
+
/**
|
|
7
|
+
* The overall timeout for a request response operation.
|
|
8
|
+
*/
|
|
9
|
+
overallRequestTimeoutMs: number;
|
|
10
|
+
/**
|
|
11
|
+
* The timeout for an individual request response peer interaction.
|
|
12
|
+
*/
|
|
13
|
+
individualRequestTimeoutMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const p2pReqRespConfigMappings: Record<keyof P2PReqRespConfig, ConfigMapping>;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,0BAA0B,CAAC;AAElF,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAC1D,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAGvD,eAAO,MAAM,0BAA0B,EAAE,gBAGxC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAEhC;;OAEG;IACH,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,gBAAgB,EAAE,aAAa,CAWlF,CAAC"}
|
|
@@ -4,17 +4,18 @@ export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 4000;
|
|
|
4
4
|
// For use in tests.
|
|
5
5
|
export const DEFAULT_P2P_REQRESP_CONFIG = {
|
|
6
6
|
overallRequestTimeoutMs: DEFAULT_OVERALL_REQUEST_TIMEOUT_MS,
|
|
7
|
-
individualRequestTimeoutMs: DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS
|
|
7
|
+
individualRequestTimeoutMs: DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
|
|
8
8
|
};
|
|
9
9
|
export const p2pReqRespConfigMappings = {
|
|
10
10
|
overallRequestTimeoutMs: {
|
|
11
11
|
env: 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS',
|
|
12
12
|
description: 'The overall timeout for a request response operation.',
|
|
13
|
-
...numberConfigHelper(DEFAULT_OVERALL_REQUEST_TIMEOUT_MS)
|
|
13
|
+
...numberConfigHelper(DEFAULT_OVERALL_REQUEST_TIMEOUT_MS),
|
|
14
14
|
},
|
|
15
15
|
individualRequestTimeoutMs: {
|
|
16
16
|
env: 'P2P_REQRESP_INDIVIDUAL_REQUEST_TIMEOUT_MS',
|
|
17
17
|
description: 'The timeout for an individual request response peer interaction.',
|
|
18
|
-
...numberConfigHelper(DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS)
|
|
19
|
-
}
|
|
18
|
+
...numberConfigHelper(DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS),
|
|
19
|
+
},
|
|
20
20
|
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Isa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRixNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRyxJQUFJLENBQUM7QUFDMUQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBRXZELG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUI7SUFDMUQsdUJBQXVCLEVBQUUsa0NBQWtDO0lBQzNELDBCQUEwQixFQUFFLHFDQUFxQztDQUNsRSxDQUFDO0FBY0YsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWtEO0lBQ3JGLHVCQUF1QixFQUFFO1FBQ3ZCLEdBQUcsRUFBRSx3Q0FBd0M7UUFDN0MsV0FBVyxFQUFFLHVEQUF1RDtRQUNwRSxHQUFHLGtCQUFrQixDQUFDLGtDQUFrQyxDQUFDO0tBQzFEO0lBQ0QsMEJBQTBCLEVBQUU7UUFDMUIsR0FBRyxFQUFFLDJDQUEyQztRQUNoRCxXQUFXLEVBQUUsa0VBQWtFO1FBQy9FLEdBQUcsa0JBQWtCLENBQUMscUNBQXFDLENBQUM7S0FDN0Q7Q0FDRixDQUFDIn0=
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type PeerId } from '@libp2p/interface';
|
|
2
|
+
import { type ConnectionSampler } from './connection_sampler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages batches of peers for parallel request processing.
|
|
5
|
+
* Tracks active peers and provides deterministic peer assignment for requests.
|
|
6
|
+
*
|
|
7
|
+
* Example with 3 peers and 10 requests:
|
|
8
|
+
*
|
|
9
|
+
* Peers: [P1] [P2] [P3]
|
|
10
|
+
* ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
|
|
11
|
+
* Requests: 0,1,2,9 | 3,4,5 | 6,7,8
|
|
12
|
+
*
|
|
13
|
+
* Each peer handles a bucket of consecutive requests.
|
|
14
|
+
* If a peer fails, it is replaced while maintaining the same bucket.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BatchConnectionSampler {
|
|
17
|
+
private readonly connectionSampler;
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private readonly batch;
|
|
20
|
+
private readonly requestsPerPeer;
|
|
21
|
+
constructor(connectionSampler: ConnectionSampler, batchSize: number, maxPeers: number);
|
|
22
|
+
/**
|
|
23
|
+
* Gets the peer responsible for handling a specific request index
|
|
24
|
+
*
|
|
25
|
+
* @param index - The request index
|
|
26
|
+
* @returns The peer assigned to handle this request
|
|
27
|
+
*/
|
|
28
|
+
getPeerForRequest(index: number): PeerId | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Removes a peer and replaces it with a new one, maintaining the same position
|
|
31
|
+
* in the batch array to keep request distribution consistent
|
|
32
|
+
*
|
|
33
|
+
* @param peerId - The peer to remove and replace
|
|
34
|
+
*/
|
|
35
|
+
removePeerAndReplace(peerId: PeerId): void;
|
|
36
|
+
/**
|
|
37
|
+
* Gets the number of active peers
|
|
38
|
+
*/
|
|
39
|
+
get activePeerCount(): number;
|
|
40
|
+
/**
|
|
41
|
+
* Gets the number of requests each peer is assigned to handle
|
|
42
|
+
*/
|
|
43
|
+
get requestsPerBucket(): number;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=batch_connection_sampler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch_connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/batch_connection_sampler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;IAKrB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJ9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;IAC/E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAEZ,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAetG;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUpD;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmB1C;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF"}
|
|
@@ -11,12 +11,9 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
11
11
|
*
|
|
12
12
|
* Each peer handles a bucket of consecutive requests.
|
|
13
13
|
* If a peer fails, it is replaced while maintaining the same bucket.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
batch;
|
|
18
|
-
requestsPerPeer;
|
|
19
|
-
constructor(connectionSampler, batchSize, maxPeers){
|
|
14
|
+
*/
|
|
15
|
+
export class BatchConnectionSampler {
|
|
16
|
+
constructor(connectionSampler, batchSize, maxPeers) {
|
|
20
17
|
this.connectionSampler = connectionSampler;
|
|
21
18
|
this.logger = createLogger('p2p:reqresp:batch-connection-sampler');
|
|
22
19
|
this.batch = [];
|
|
@@ -32,11 +29,12 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
32
29
|
this.batch = this.connectionSampler.samplePeersBatch(maxPeers);
|
|
33
30
|
}
|
|
34
31
|
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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) {
|
|
40
38
|
if (this.batch.length === 0) {
|
|
41
39
|
return undefined;
|
|
42
40
|
}
|
|
@@ -45,44 +43,39 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
45
43
|
return this.batch[peerIndex];
|
|
46
44
|
}
|
|
47
45
|
/**
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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);
|
|
54
53
|
if (index === -1) {
|
|
55
54
|
return;
|
|
56
55
|
}
|
|
57
|
-
const excluding = new Map([
|
|
58
|
-
[
|
|
59
|
-
peerId.toString(),
|
|
60
|
-
true
|
|
61
|
-
]
|
|
62
|
-
]);
|
|
56
|
+
const excluding = new Map([[peerId.toString(), true]]);
|
|
63
57
|
const newPeer = this.connectionSampler.getPeer(excluding);
|
|
64
58
|
if (newPeer) {
|
|
65
59
|
this.batch[index] = newPeer;
|
|
66
|
-
this.logger.trace(`Replaced peer ${peerId} with ${newPeer}`, {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
});
|
|
70
|
-
} else {
|
|
60
|
+
this.logger.trace(`Replaced peer ${peerId} with ${newPeer}`, { peerId, newPeer });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
71
63
|
// If we couldn't get a replacement, remove the peer and compact the array
|
|
72
64
|
this.batch.splice(index, 1);
|
|
73
|
-
this.logger.trace(`Removed peer ${peerId}`, {
|
|
74
|
-
peerId
|
|
75
|
-
});
|
|
65
|
+
this.logger.trace(`Removed peer ${peerId}`, { peerId });
|
|
76
66
|
}
|
|
77
67
|
}
|
|
78
68
|
/**
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
* Gets the number of active peers
|
|
70
|
+
*/
|
|
71
|
+
get activePeerCount() {
|
|
81
72
|
return this.batch.length;
|
|
82
73
|
}
|
|
83
74
|
/**
|
|
84
|
-
|
|
85
|
-
|
|
75
|
+
* Gets the number of requests each peer is assigned to handle
|
|
76
|
+
*/
|
|
77
|
+
get requestsPerBucket() {
|
|
86
78
|
return this.requestsPerPeer;
|
|
87
79
|
}
|
|
88
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"}
|
|
@@ -12,18 +12,10 @@ export class RandomSampler {
|
|
|
12
12
|
* We do this MAX_SAMPLE_ATTEMPTS times, if we still don't find a peer we just go for it.
|
|
13
13
|
*
|
|
14
14
|
* @dev Close must always be called on connections, else memory leak
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
cleanupIntervalMs
|
|
18
|
-
sampler
|
|
19
|
-
logger;
|
|
20
|
-
cleanupInterval;
|
|
21
|
-
abortController;
|
|
22
|
-
activeConnectionsCount;
|
|
23
|
-
streams;
|
|
24
|
-
// Serial queue to ensure that we only dial one peer at a time
|
|
25
|
-
dialQueue;
|
|
26
|
-
constructor(libp2p, cleanupIntervalMs = 60000, sampler = new RandomSampler()){
|
|
15
|
+
*/
|
|
16
|
+
export class ConnectionSampler {
|
|
17
|
+
constructor(libp2p, cleanupIntervalMs = 60000, // Default to 1 minute
|
|
18
|
+
sampler = new RandomSampler()) {
|
|
27
19
|
this.libp2p = libp2p;
|
|
28
20
|
this.cleanupIntervalMs = cleanupIntervalMs;
|
|
29
21
|
this.sampler = sampler;
|
|
@@ -31,28 +23,31 @@ export class RandomSampler {
|
|
|
31
23
|
this.abortController = new AbortController();
|
|
32
24
|
this.activeConnectionsCount = new Map();
|
|
33
25
|
this.streams = new Map();
|
|
26
|
+
// Serial queue to ensure that we only dial one peer at a time
|
|
34
27
|
this.dialQueue = new SerialQueue();
|
|
35
|
-
this.cleanupInterval = setInterval(()=>void this.cleanupStaleConnections(), this.cleanupIntervalMs);
|
|
28
|
+
this.cleanupInterval = setInterval(() => void this.cleanupStaleConnections(), this.cleanupIntervalMs);
|
|
36
29
|
this.dialQueue.start();
|
|
37
30
|
}
|
|
38
31
|
/**
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
* Stops the cleanup job and closes all active connections
|
|
33
|
+
*/
|
|
34
|
+
async stop() {
|
|
41
35
|
this.logger.info('Stopping connection sampler');
|
|
42
36
|
clearInterval(this.cleanupInterval);
|
|
43
37
|
this.abortController.abort();
|
|
44
38
|
await this.dialQueue.end();
|
|
45
39
|
// Close all active streams
|
|
46
|
-
const closePromises = Array.from(this.streams.keys()).map(
|
|
40
|
+
const closePromises = Array.from(this.streams.keys()).map(streamId => this.close(streamId));
|
|
47
41
|
await Promise.all(closePromises);
|
|
48
42
|
this.logger.info('Connection sampler stopped');
|
|
49
43
|
}
|
|
50
44
|
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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) {
|
|
56
51
|
// In libp2p getPeers performs a shallow copy, so this array can be sliced from safetly
|
|
57
52
|
const peers = this.libp2p.getPeers();
|
|
58
53
|
if (peers.length === 0) {
|
|
@@ -63,38 +58,42 @@ export class RandomSampler {
|
|
|
63
58
|
// Keep sampling while:
|
|
64
59
|
// - we haven't exceeded max attempts AND
|
|
65
60
|
// - either the peer has active connections OR is in the exclusion list
|
|
66
|
-
while(attempts < MAX_SAMPLE_ATTEMPTS &&
|
|
61
|
+
while (attempts < MAX_SAMPLE_ATTEMPTS &&
|
|
62
|
+
((this.activeConnectionsCount.get(peers[randomIndex]) ?? 0) > 0 ||
|
|
63
|
+
(excluding?.get(peers[randomIndex]?.toString()) ?? false))) {
|
|
67
64
|
peers.splice(randomIndex, 1);
|
|
68
65
|
randomIndex = this.sampler.random(peers.length);
|
|
69
66
|
attempts++;
|
|
70
67
|
}
|
|
71
68
|
this.logger.trace(`Sampled peer in ${attempts} attempts`, {
|
|
72
69
|
attempts,
|
|
73
|
-
peer: peers[randomIndex]?.toString()
|
|
70
|
+
peer: peers[randomIndex]?.toString(),
|
|
74
71
|
});
|
|
75
72
|
return peers[randomIndex];
|
|
76
73
|
}
|
|
77
74
|
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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) {
|
|
83
81
|
const peers = this.libp2p.getPeers();
|
|
84
82
|
const sampledPeers = [];
|
|
85
83
|
const peersWithConnections = []; // Hold onto peers with active connections incase we need to sample more
|
|
86
|
-
for (const peer of peers){
|
|
84
|
+
for (const peer of peers) {
|
|
87
85
|
const activeConnections = this.activeConnectionsCount.get(peer) ?? 0;
|
|
88
86
|
if (activeConnections === 0) {
|
|
89
87
|
if (sampledPeers.push(peer) === numberToSample) {
|
|
90
88
|
return sampledPeers;
|
|
91
89
|
}
|
|
92
|
-
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
93
92
|
peersWithConnections.push(peer);
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
95
|
// If we still need more peers, sample from those with connections
|
|
97
|
-
while(sampledPeers.length < numberToSample && peersWithConnections.length > 0){
|
|
96
|
+
while (sampledPeers.length < numberToSample && peersWithConnections.length > 0) {
|
|
98
97
|
const randomIndex = this.sampler.random(peersWithConnections.length);
|
|
99
98
|
const [peer] = peersWithConnections.splice(randomIndex, 1);
|
|
100
99
|
sampledPeers.push(peer);
|
|
@@ -102,41 +101,38 @@ export class RandomSampler {
|
|
|
102
101
|
this.logger.trace(`Batch sampled ${sampledPeers.length} unique peers`, {
|
|
103
102
|
peers: sampledPeers,
|
|
104
103
|
withoutConnections: sampledPeers.length - peersWithConnections.length,
|
|
105
|
-
withConnections: peersWithConnections.length
|
|
104
|
+
withConnections: peersWithConnections.length,
|
|
106
105
|
});
|
|
107
106
|
return sampledPeers;
|
|
108
107
|
}
|
|
109
108
|
// Set of passthrough functions to keep track of active connections
|
|
110
109
|
/**
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
117
|
// Dialling at the same time can cause race conditions where two different streams
|
|
118
118
|
// end up with the same id, hence a serial queue
|
|
119
|
-
const stream = await this.dialQueue.put(()=>this.libp2p.dialProtocol(peerId, protocol, {
|
|
120
|
-
|
|
121
|
-
}));
|
|
122
|
-
this.streams.set(stream.id, {
|
|
123
|
-
stream,
|
|
124
|
-
peerId
|
|
125
|
-
});
|
|
119
|
+
const stream = await this.dialQueue.put(() => this.libp2p.dialProtocol(peerId, protocol, { signal: this.abortController.signal }));
|
|
120
|
+
this.streams.set(stream.id, { stream, peerId });
|
|
126
121
|
const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 0) + 1;
|
|
127
122
|
this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
|
|
128
123
|
this.logger.trace(`Dialed protocol ${protocol} with peer ${peerId.toString()}`, {
|
|
129
124
|
streamId: stream.id,
|
|
130
125
|
peerId: peerId.toString(),
|
|
131
|
-
activeConnectionsCount: updatedActiveConnectionsCount
|
|
126
|
+
activeConnectionsCount: updatedActiveConnectionsCount,
|
|
132
127
|
});
|
|
133
128
|
return stream;
|
|
134
129
|
}
|
|
135
130
|
/**
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
131
|
+
* Closes a stream and updates the active connections count
|
|
132
|
+
*
|
|
133
|
+
* @param streamId - The stream id
|
|
134
|
+
*/
|
|
135
|
+
async close(streamId) {
|
|
140
136
|
try {
|
|
141
137
|
const { stream, peerId } = this.streams.get(streamId);
|
|
142
138
|
const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 1) - 1;
|
|
@@ -145,32 +141,35 @@ export class RandomSampler {
|
|
|
145
141
|
streamId,
|
|
146
142
|
peerId: peerId.toString(),
|
|
147
143
|
protocol: stream.protocol,
|
|
148
|
-
activeConnectionsCount: updatedActiveConnectionsCount
|
|
144
|
+
activeConnectionsCount: updatedActiveConnectionsCount,
|
|
149
145
|
});
|
|
150
146
|
await stream?.close();
|
|
151
|
-
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
152
149
|
this.logger.warn(`Failed to close connection to peer with stream id ${streamId}`);
|
|
153
|
-
}
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
154
152
|
this.streams.delete(streamId);
|
|
155
153
|
}
|
|
156
154
|
}
|
|
157
155
|
/**
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
* Cleans up stale connections that we have lost accounting for
|
|
157
|
+
*/
|
|
158
|
+
async cleanupStaleConnections() {
|
|
160
159
|
// Look for streams without anything in the activeConnectionsCount
|
|
161
160
|
// If we find anything, close the stream
|
|
162
|
-
for (const [streamId, { peerId }] of this.streams.entries()){
|
|
161
|
+
for (const [streamId, { peerId }] of this.streams.entries()) {
|
|
163
162
|
try {
|
|
164
163
|
// Check if we have lost track of accounting
|
|
165
164
|
if (this.activeConnectionsCount.get(peerId) === 0) {
|
|
166
165
|
await this.close(streamId);
|
|
167
166
|
this.logger.debug(`Cleaned up stale connection ${streamId} to peer ${peerId.toString()}`);
|
|
168
167
|
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
this.logger.error(`Error cleaning up stale connection ${streamId}`, { error });
|
|
173
171
|
}
|
|
174
172
|
}
|
|
175
173
|
}
|
|
176
174
|
}
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbl9zYW1wbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3JlcXJlc3AvY29ubmVjdGlvbi1zYW1wbGVyL2Nvbm5lY3Rpb25fc2FtcGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXRELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBTzlCLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQVc1QixZQUNtQixNQUFjLEVBQ2Qsb0JBQTRCLEtBQUssRUFBRSxzQkFBc0I7SUFDekQsVUFBeUIsSUFBSSxhQUFhLEVBQUU7UUFGNUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFDakMsWUFBTyxHQUFQLE9BQU8sQ0FBcUM7UUFiOUMsV0FBTSxHQUFHLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRWpFLG9CQUFlLEdBQW9CLElBQUksZUFBZSxFQUFFLENBQUM7UUFFaEQsMkJBQXNCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEQsWUFBTyxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRW5FLDhEQUE4RDtRQUN0RCxjQUFTLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFPakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/index.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
export {};
|
|
1
2
|
/**
|
|
2
3
|
* Request Response protocol allows nodes to ask their peers for data
|
|
3
4
|
* that they missed via the traditional gossip protocol.
|
|
4
|
-
*/
|
|
5
|
+
*/
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHIn0=
|