All files / src/peer_book tried_list.ts

100% Statements 21/21
100% Branches 8/8
100% Functions 3/3
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82                            35x   35x   35x           35x                   512x           512x 512x           4x               177x 177x 177x 177x 1x   176x   176x 34x 34x       34x   142x         142x   142x      
/*
 * Copyright © 2019 Lisk Foundation
 *
 * See the LICENSE file at the top-level directory of this distribution
 * for licensing information.
 *
 * Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation,
 * no part of this software, including this file, may be copied, modified,
 * propagated, or distributed except according to the terms contained in the
 * LICENSE file.
 *
 * Removal or modification of this copyright notice is prohibited.
 *
 */
import { DEFAULT_MAX_RECONNECT_TRIES } from '../constants';
import { P2PPeerInfo } from '../p2p_types';
import { PEER_TYPE } from '../utils';
 
import { BaseList, PeerListConfig } from './base_list';
 
export interface TriedListConfig extends PeerListConfig {
	readonly maxReconnectTries?: number;
}
 
export class TriedList extends BaseList {
	private readonly _maxReconnectTries: number;
 
	public constructor({
		numOfBuckets,
		bucketSize,
		maxReconnectTries,
		secret,
		peerType,
	}: TriedListConfig) {
		super({
			secret,
			numOfBuckets,
			bucketSize,
			peerType,
		});
		this.type = PEER_TYPE.TRIED_PEER;
		this._maxReconnectTries = maxReconnectTries
			? maxReconnectTries
			: DEFAULT_MAX_RECONNECT_TRIES;
	}
 
	public get triedPeerConfig(): TriedListConfig {
		return {
			...this.peerListConfig,
			maxReconnectTries: this._maxReconnectTries,
		};
	}
 
	public failedConnectionAction(incomingPeerInfo: P2PPeerInfo): boolean {
		// Bucket calculation does not require sourceAddress and is deterministic
		const { bucket } = this.calculateBucket(incomingPeerInfo.ipAddress);
		const incomingPeerId = incomingPeerInfo.peerId;
		const foundPeer = bucket.get(incomingPeerId);
		if (!foundPeer) {
			return false;
		}
		const { numOfConnectionFailures } = foundPeer;
 
		if ((numOfConnectionFailures as number) + 1 >= this._maxReconnectTries) {
			const removedFromBucket = bucket.delete(incomingPeerId);
			const removedFromPeerLookup = this.peerIdToPeerInfo.delete(
				incomingPeerId,
			);
 
			return removedFromBucket && removedFromPeerLookup;
		}
		const updatedTriedPeerInfo = {
			...foundPeer,
			numOfConnectionFailures: (numOfConnectionFailures as number) + 1,
		};
 
		bucket.set(incomingPeerId, updatedTriedPeerInfo);
 
		return false;
	}
}