public void IsAllowed_Peer() { var swarm = new Swarm(); var peer = new Peer { Id = "QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h", Addresses = new MultiAddress[] { "/ip4/127.0.0.1/ipfs/QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h" } }; Assert.IsTrue(swarm.IsAllowed(peer)); swarm.BlackList.Add(peer.Addresses.First()); Assert.IsFalse(swarm.IsAllowed(peer)); swarm.BlackList.Clear(); swarm.BlackList.Add("/p2p/QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h"); Assert.IsFalse(swarm.IsAllowed(peer)); }
#pragma warning disable VSTHRD100 // Avoid async void methods /// <summary> /// Called when the swarm has lost a connection to a peer. /// </summary> /// <param name="sender"> /// The swarm of peers. /// </param> /// <param name="disconnectedPeer"> /// The peer that was disconnected. /// </param> /// <remarks> /// If the <see cref="MinConnections"/> is not reached, then another /// peer is dialed. /// </remarks> async void OnPeerDisconnected(object sender, Peer disconnectedPeer) #pragma warning restore VSTHRD100 // Avoid async void methods { var n = swarm.Manager.Connections.Count() + pendingConnects; if (!swarm.IsRunning || n >= MinConnections) { return; } // Find a random peer to connect with. var peers = swarm.KnownPeers .Where(p => p.ConnectedAddress == null) .Where(p => p != disconnectedPeer) .Where(p => swarm.IsAllowed(p)) .Where(p => !swarm.HasPendingConnection(p)) .ToArray(); if (peers.Length == 0) { return; } var rng = new Random(); var peer = peers[rng.Next(peers.Count())]; Interlocked.Increment(ref pendingConnects); log.Debug($"Dialing {peer}"); try { await swarm.ConnectAsync(peer).ConfigureAwait(false); } catch (Exception) { log.Warn($"Failed to dial {peer}"); } finally { Interlocked.Decrement(ref pendingConnects); } }