@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.
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +6 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +2 -2
- package/dest/mocks/index.d.ts +3 -3
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +19 -18
- package/dest/services/dummy_service.d.ts +7 -0
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +10 -1
- package/dest/services/libp2p/libp2p_service.d.ts +17 -13
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +109 -101
- 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 +26 -0
- package/dest/services/{peer_manager.d.ts → peer-manager/peer_manager.d.ts} +23 -8
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +392 -0
- package/dest/services/{peer-scoring → peer-manager}/peer_scoring.d.ts +3 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +84 -0
- 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 +81 -0
- 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 +175 -0
- package/dest/services/reqresp/interface.d.ts +17 -4
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +34 -11
- 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 +42 -0
- 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 +9 -0
- 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 +92 -0
- 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 +9 -0
- 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 +9 -0
- package/dest/services/reqresp/{handlers.d.ts → protocols/status.d.ts} +1 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +9 -0
- 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 +23 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.js +1 -1
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts +3 -3
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.js +4 -4
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +55 -0
- package/dest/services/reqresp/reqresp.d.ts +33 -6
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +414 -249
- package/dest/services/service.d.ts +8 -0
- package/dest/services/service.d.ts.map +1 -1
- package/dest/util.d.ts +4 -0
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +1 -1
- package/package.json +8 -8
- package/src/client/p2p_client.ts +5 -5
- package/src/mem_pools/attestation_pool/mocks.ts +2 -2
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -1
- package/src/mocks/index.ts +19 -20
- package/src/services/dummy_service.ts +13 -0
- package/src/services/libp2p/libp2p_service.ts +143 -128
- package/src/services/peer-manager/metrics.ts +41 -0
- package/src/services/{peer_manager.ts → peer-manager/peer_manager.ts} +67 -22
- package/src/services/{peer-scoring → peer-manager}/peer_scoring.ts +16 -3
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +211 -0
- package/src/services/reqresp/interface.ts +39 -16
- package/src/services/reqresp/metrics.ts +57 -0
- package/src/services/reqresp/protocols/block.ts +15 -0
- package/src/services/reqresp/protocols/goodbye.ts +101 -0
- package/src/services/reqresp/protocols/index.ts +8 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/{handlers.ts → protocols/status.ts} +0 -9
- package/src/services/reqresp/protocols/tx.ts +29 -0
- package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.ts +3 -3
- package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.ts +24 -4
- package/src/services/reqresp/reqresp.ts +224 -25
- package/src/services/service.ts +12 -0
- package/src/util.ts +4 -0
- package/dest/services/peer-scoring/peer_scoring.d.ts.map +0 -1
- package/dest/services/peer-scoring/peer_scoring.js +0 -75
- package/dest/services/peer_manager.d.ts.map +0 -1
- package/dest/services/peer_manager.js +0 -358
- package/dest/services/reqresp/handlers.d.ts.map +0 -1
- package/dest/services/reqresp/handlers.js +0 -17
- package/dest/services/reqresp/rate_limiter/index.d.ts.map +0 -1
- package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
- package/dest/services/reqresp/rate_limiter/rate_limits.js +0 -35
- /package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.d.ts +0 -0
- /package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.d.ts +0 -0
- /package/src/services/reqresp/{rate_limiter → rate-limiter}/index.ts +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Request response metrics
|
|
2
|
+
import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
|
|
3
|
+
import { type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec/telemetry-client';
|
|
4
|
+
|
|
5
|
+
export class ReqRespMetrics {
|
|
6
|
+
public readonly tracer: Tracer;
|
|
7
|
+
|
|
8
|
+
private readonly sentRequests: UpDownCounter;
|
|
9
|
+
private readonly receivedRequests: UpDownCounter;
|
|
10
|
+
|
|
11
|
+
private readonly failedOutboundRequests: UpDownCounter;
|
|
12
|
+
private readonly failedInboundRequests: UpDownCounter;
|
|
13
|
+
|
|
14
|
+
constructor(readonly telemetryClient: TelemetryClient, name = 'ReqResp') {
|
|
15
|
+
this.tracer = telemetryClient.getTracer(name);
|
|
16
|
+
|
|
17
|
+
const meter = telemetryClient.getMeter(name);
|
|
18
|
+
this.sentRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_SENT_REQUESTS, {
|
|
19
|
+
description: 'Number of requests sent to peers',
|
|
20
|
+
unit: 'requests',
|
|
21
|
+
valueType: ValueType.INT,
|
|
22
|
+
});
|
|
23
|
+
this.receivedRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_RECEIVED_REQUESTS, {
|
|
24
|
+
description: 'Number of requests received from peers',
|
|
25
|
+
unit: 'requests',
|
|
26
|
+
valueType: ValueType.INT,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
this.failedOutboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_OUTBOUND_REQUESTS, {
|
|
30
|
+
description: 'Number of failed outbound requests - nodes not getting valid responses',
|
|
31
|
+
unit: 'requests',
|
|
32
|
+
valueType: ValueType.INT,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
this.failedInboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_INBOUND_REQUESTS, {
|
|
36
|
+
description: 'Number of failed inbound requests - node failing to respond to requests',
|
|
37
|
+
unit: 'requests',
|
|
38
|
+
valueType: ValueType.INT,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public recordRequestSent(protocol: string) {
|
|
43
|
+
this.sentRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public recordRequestReceived(protocol: string) {
|
|
47
|
+
this.receivedRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public recordRequestError(protocol: string) {
|
|
51
|
+
this.failedOutboundRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public recordResponseError(protocol: string) {
|
|
55
|
+
this.failedInboundRequests.add(1, { [Attributes.P2P_REQ_RESP_PROTOCOL]: protocol });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type L2BlockSource } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
3
|
+
|
|
4
|
+
import { type PeerId } from '@libp2p/interface';
|
|
5
|
+
|
|
6
|
+
import { type ReqRespSubProtocolHandler } from '../interface.js';
|
|
7
|
+
|
|
8
|
+
export function reqRespBlockHandler(l2BlockSource: L2BlockSource): ReqRespSubProtocolHandler {
|
|
9
|
+
return async (_peerId: PeerId, msg: Buffer) => {
|
|
10
|
+
const blockNumber = Fr.fromBuffer(msg);
|
|
11
|
+
|
|
12
|
+
const foundBlock = await l2BlockSource.getBlock(Number(blockNumber));
|
|
13
|
+
return foundBlock ? foundBlock.toBuffer() : Buffer.alloc(0);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { type PeerId } from '@libp2p/interface';
|
|
4
|
+
|
|
5
|
+
import { type PeerManager } from '../../peer-manager/peer_manager.js';
|
|
6
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../interface.js';
|
|
7
|
+
import { type ReqResp } from '../reqresp.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Enum defining the possible reasons for a goodbye message.
|
|
11
|
+
*/
|
|
12
|
+
export enum GoodByeReason {
|
|
13
|
+
/** The peer has shutdown, will be received whenever a peer's node is routinely stopped */
|
|
14
|
+
SHUTDOWN = 0x1,
|
|
15
|
+
/** Whenever the peer must disconnect due to maintaining max peers */
|
|
16
|
+
DISCONNECTED = 0x2,
|
|
17
|
+
/** The peer has a low score, will be received whenever a peer's score is low */
|
|
18
|
+
LOW_SCORE = 0x3,
|
|
19
|
+
/** The peer has been banned, will be received whenever a peer is banned */
|
|
20
|
+
BANNED = 0x4,
|
|
21
|
+
/** Wrong network / fork */
|
|
22
|
+
WRONG_NETWORK = 0x5,
|
|
23
|
+
/** Unknown reason */
|
|
24
|
+
UNKNOWN = 0x6,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function encodeGoodbyeReason(reason: GoodByeReason): Buffer {
|
|
28
|
+
return Buffer.from([reason]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function decodeGoodbyeReason(buffer: Buffer): GoodByeReason {
|
|
32
|
+
try {
|
|
33
|
+
if (buffer.length !== 1) {
|
|
34
|
+
throw new Error('Invalid goodbye reason buffer length');
|
|
35
|
+
}
|
|
36
|
+
return buffer[0] as GoodByeReason;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
return GoodByeReason.UNKNOWN;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Pretty prints the goodbye reason.
|
|
44
|
+
* @param reason - The goodbye reason.
|
|
45
|
+
* @returns The pretty printed goodbye reason.
|
|
46
|
+
*/
|
|
47
|
+
export function prettyGoodbyeReason(reason: GoodByeReason): string {
|
|
48
|
+
switch (reason) {
|
|
49
|
+
case GoodByeReason.SHUTDOWN:
|
|
50
|
+
return 'shutdown';
|
|
51
|
+
case GoodByeReason.DISCONNECTED:
|
|
52
|
+
return 'disconnected';
|
|
53
|
+
case GoodByeReason.LOW_SCORE:
|
|
54
|
+
return 'low_score';
|
|
55
|
+
case GoodByeReason.BANNED:
|
|
56
|
+
return 'banned';
|
|
57
|
+
// TODO(#11328): implement
|
|
58
|
+
case GoodByeReason.WRONG_NETWORK:
|
|
59
|
+
return 'wrong_network';
|
|
60
|
+
case GoodByeReason.UNKNOWN:
|
|
61
|
+
return 'unknown';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Handles a goodbye message request
|
|
67
|
+
*/
|
|
68
|
+
export class GoodbyeProtocolHandler {
|
|
69
|
+
private logger = createLogger('p2p:goodbye-protocol');
|
|
70
|
+
|
|
71
|
+
constructor(private reqresp: ReqResp) {}
|
|
72
|
+
|
|
73
|
+
public async sendGoodbye(peerId: PeerId, reason: GoodByeReason): Promise<void> {
|
|
74
|
+
try {
|
|
75
|
+
await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.GOODBYE, Buffer.from([reason]));
|
|
76
|
+
this.logger.debug(`Sent goodbye to peer ${peerId.toString()} with reason ${reason}`);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
this.logger.debug(`Failed to send goodbye to peer ${peerId.toString()}: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Handles the goodbye request. In request response, the goodbye request is handled by the peer manager.
|
|
85
|
+
*
|
|
86
|
+
* @dev Implemented as returning a function as the function is bound in the libp2p service, however
|
|
87
|
+
* its implementation is here to keep functionality together.
|
|
88
|
+
*
|
|
89
|
+
* @param peerManager - The peer manager.
|
|
90
|
+
* @returns A resolved promise with the goodbye response.
|
|
91
|
+
*/
|
|
92
|
+
export function reqGoodbyeHandler(peerManager: PeerManager): ReqRespSubProtocolHandler {
|
|
93
|
+
return (peerId: PeerId, _msg: Buffer) => {
|
|
94
|
+
const reason = decodeGoodbyeReason(_msg);
|
|
95
|
+
|
|
96
|
+
peerManager.goodbyeReceived(peerId, reason);
|
|
97
|
+
|
|
98
|
+
// Return a buffer of length 1 as an acknowledgement
|
|
99
|
+
return Promise.resolve(Buffer.from([0x0]));
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Handles the ping request.
|
|
3
|
-
* @param _msg - The ping request message.
|
|
4
|
-
* @returns A resolved promise with the pong response.
|
|
5
|
-
*/
|
|
6
|
-
export function pingHandler(_msg: any): Promise<Buffer> {
|
|
7
|
-
return Promise.resolve(Buffer.from('pong'));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
1
|
/**
|
|
11
2
|
* Handles the status request.
|
|
12
3
|
* @param _msg - The status request message.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type P2PClientType } from '@aztec/circuit-types';
|
|
2
|
+
import { TxHash } from '@aztec/circuit-types/tx_hash';
|
|
3
|
+
|
|
4
|
+
import { type PeerId } from '@libp2p/interface';
|
|
5
|
+
|
|
6
|
+
import { type MemPools } from '../../../mem_pools/interface.js';
|
|
7
|
+
import { type ReqRespSubProtocolHandler } from '../interface.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* We want to keep the logic of the req resp handler in this file, but we do not have a reference to the mempools here
|
|
11
|
+
* so we need to pass it in as a parameter.
|
|
12
|
+
*
|
|
13
|
+
* Handler for tx requests
|
|
14
|
+
* @param mempools - the mempools
|
|
15
|
+
* @returns the tx response message
|
|
16
|
+
*/
|
|
17
|
+
export function reqRespTxHandler<T extends P2PClientType>(mempools: MemPools<T>): ReqRespSubProtocolHandler {
|
|
18
|
+
/**
|
|
19
|
+
* Handler for tx requests
|
|
20
|
+
* @param msg - the tx request message
|
|
21
|
+
* @returns the tx response message
|
|
22
|
+
*/
|
|
23
|
+
return (_peerId: PeerId, msg: Buffer) => {
|
|
24
|
+
const txHash = TxHash.fromBuffer(msg);
|
|
25
|
+
const foundTx = mempools.txPool.getTxByHash(txHash);
|
|
26
|
+
const buf = foundTx ? foundTx.toBuffer() : Buffer.alloc(0);
|
|
27
|
+
return Promise.resolve(buf);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -7,7 +7,7 @@ import { PeerErrorSeverity } from '@aztec/circuit-types';
|
|
|
7
7
|
|
|
8
8
|
import { type PeerId } from '@libp2p/interface';
|
|
9
9
|
|
|
10
|
-
import { type
|
|
10
|
+
import { type PeerScoring } from '../../peer-manager/peer_scoring.js';
|
|
11
11
|
import { type ReqRespSubProtocol, type ReqRespSubProtocolRateLimits } from '../interface.js';
|
|
12
12
|
import { DEFAULT_RATE_LIMITS } from './rate_limits.js';
|
|
13
13
|
|
|
@@ -169,7 +169,7 @@ export class RequestResponseRateLimiter {
|
|
|
169
169
|
|
|
170
170
|
private cleanupInterval: NodeJS.Timeout | undefined = undefined;
|
|
171
171
|
|
|
172
|
-
constructor(private
|
|
172
|
+
constructor(private peerScoring: PeerScoring, rateLimits: ReqRespSubProtocolRateLimits = DEFAULT_RATE_LIMITS) {
|
|
173
173
|
this.subProtocolRateLimiters = new Map();
|
|
174
174
|
|
|
175
175
|
for (const [subProtocol, protocolLimits] of Object.entries(rateLimits)) {
|
|
@@ -200,7 +200,7 @@ export class RequestResponseRateLimiter {
|
|
|
200
200
|
|
|
201
201
|
switch (rateLimitStatus) {
|
|
202
202
|
case RateLimitStatus.DeniedPeer:
|
|
203
|
-
this.
|
|
203
|
+
this.peerScoring.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
204
204
|
return false;
|
|
205
205
|
case RateLimitStatus.DeniedGlobal:
|
|
206
206
|
return false;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolRateLimits } from '../interface.js';
|
|
2
2
|
|
|
3
3
|
// TODO(md): these defaults need to be tuned
|
|
4
4
|
export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
|
|
5
|
-
[
|
|
5
|
+
[ReqRespSubProtocol.PING]: {
|
|
6
6
|
peerLimit: {
|
|
7
7
|
quotaTimeMs: 1000,
|
|
8
8
|
quotaCount: 5,
|
|
@@ -12,7 +12,7 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
|
|
|
12
12
|
quotaCount: 10,
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
|
-
[
|
|
15
|
+
[ReqRespSubProtocol.STATUS]: {
|
|
16
16
|
peerLimit: {
|
|
17
17
|
quotaTimeMs: 1000,
|
|
18
18
|
quotaCount: 5,
|
|
@@ -22,7 +22,27 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
|
|
|
22
22
|
quotaCount: 10,
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
|
-
[
|
|
25
|
+
[ReqRespSubProtocol.TX]: {
|
|
26
|
+
peerLimit: {
|
|
27
|
+
quotaTimeMs: 1000,
|
|
28
|
+
quotaCount: 5,
|
|
29
|
+
},
|
|
30
|
+
globalLimit: {
|
|
31
|
+
quotaTimeMs: 1000,
|
|
32
|
+
quotaCount: 10,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
[ReqRespSubProtocol.BLOCK]: {
|
|
36
|
+
peerLimit: {
|
|
37
|
+
quotaTimeMs: 1000,
|
|
38
|
+
quotaCount: 2,
|
|
39
|
+
},
|
|
40
|
+
globalLimit: {
|
|
41
|
+
quotaTimeMs: 1000,
|
|
42
|
+
quotaCount: 5,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
[ReqRespSubProtocol.GOODBYE]: {
|
|
26
46
|
peerLimit: {
|
|
27
47
|
quotaTimeMs: 1000,
|
|
28
48
|
quotaCount: 5,
|