async _managePeerPool(options = {}) {
		// Exit early if the node is closing
		if (this.closing) {
			return null;
		}

		// Calculate available space for non-protocol peers
		const availableSpace = this.nodeMaxSize - this.maxSize;
		
		// Create stats object with free space calculations
		const stats = {
			freeProvide: Math.max(0, availableSpace),
			freeDiscovery: Math.max(0, availableSpace),
		};
		
		// Apply boost for initial connectivity when we have few protocol peers
		const initialBoost = Math.max(0, 3 - this.peersProtocolSize);
		if (this.peersProtocolSize > 0) {
			stats.freeProvide = Math.min(stats.freeProvide, this.maxSize + (10 * initialBoost));
			stats.freeDiscovery = Math.min(stats.freeDiscovery, this.maxSize + (20 * initialBoost));
		}

		// Log detailed stats in debug mode
		if (this.debug) {
			this._logPeerPoolStats(stats, initialBoost);
		}

		// Disconnect excess non-protocol peers to maintain ratio
		await this._manageNonProtocolPeers();

		// Special case: If we have no protocol peers, keep all non-protocol peers
		// to increase chances of finding protocol peers
		if (this.peersProtocolSize === 0) {
			if (this.size < availableSpace) {
				return stats;
			} else {
				return null;
			}
		}

		// Check if we should allow connection based on peer type
		if (options.protocol) {
			// For protocol peers: accept if we're under max size limit
			return this.peersProtocolSize < this.maxSize ? stats : null;
		} else {
			// For non-protocol peers: accept if we're under the boosted limit
			const boostedLimit = this.maxSize + (this.maxSize * initialBoost);
			return this.size < boostedLimit ? stats : null;
		}
	}
Perform periodic management of the peer pool
Ensures we maintain a healthy ratio of protocol to non-protocol peers
@param {Object} options - Options object
@param {boolean} options.protocol - Whether the potential peer uses our protocol
@returns {Object|null} Connection stats or null if connection should be rejected