public void UniqueId() { var q1 = new DistributedQuery <Peer>(); var q2 = new DistributedQuery <Peer>(); Assert.AreNotEqual(q1.Id, q2.Id); }
/// <inheritdoc /> public async Task <Peer> FindPeerAsync(MultiHash id, CancellationToken cancel = default(CancellationToken)) { // Can always find self. if (Swarm.LocalPeer.Id == id) { return(Swarm.LocalPeer); } // Maybe the swarm knows about it. var found = Swarm.KnownPeers.FirstOrDefault(p => p.Id == id); if (found != null && found.Addresses.Count() > 0) { return(found); } // Ask our peers for information on the requested peer. var dquery = new DistributedQuery <Peer> { QueryType = MessageType.FindNode, QueryKey = id, Dht = this, AnswersNeeded = 1 }; await dquery.RunAsync(cancel).ConfigureAwait(false); // If not found, return the closest peer. if (dquery.Answers.Count() == 0) { return(RoutingTable.NearestPeers(id).FirstOrDefault()); } return(dquery.Answers.First()); }
/// <inheritdoc /> public async Task <Peer> FindPeerAsync(MultiHash id, CancellationToken cancel = default(CancellationToken)) { // Can always find self. if (Swarm.LocalPeer.Id == id) { return(Swarm.LocalPeer); } // Maybe the swarm knows about it. var found = Swarm.KnownPeers.FirstOrDefault(p => p.Id == id); if (found != null && found.Addresses.Count() > 0) { return(found); } // Ask our peers for information on the requested peer. var dquery = new DistributedQuery <Peer> { QueryType = MessageType.FindNode, QueryKey = id, Dht = this, AnswersNeeded = 1 }; await dquery.RunAsync(cancel); if (dquery.Answers.Count == 0) { throw new KeyNotFoundException($"Cannot locate peer '{id}'."); } return(dquery.Answers.First()); }
public async Task Cancelling() { var dquery = new DistributedQuery <Peer>(); var cts = new CancellationTokenSource(); cts.Cancel(); await dquery.RunAsync(cts.Token); Assert.AreEqual(0, dquery.Answers.Count); }
/// <inheritdoc /> public async Task <IEnumerable <Peer> > FindProvidersAsync( Cid id, int limit = 20, Action <Peer> action = null, CancellationToken cancel = default(CancellationToken)) { var dquery = new DistributedQuery <Peer> { QueryType = MessageType.GetProviders, QueryKey = id.Hash, Dht = this, AnswersNeeded = limit, }; if (action != null) { dquery.AnswerObtained += (s, e) => action.Invoke(e); } // Add any providers that we already know about. var providers = ContentRouter .Get(id) .Select(pid => { return((pid == Swarm.LocalPeer.Id) ? Swarm.LocalPeer : Swarm.RegisterPeer(new Peer { Id = pid })); }); foreach (var provider in providers) { dquery.AddAnswer(provider); } // Ask our peers for more providers. if (limit > dquery.Answers.Count()) { await dquery.RunAsync(cancel).ConfigureAwait(false); } return(dquery.Answers.Take(limit)); }
/// <inheritdoc /> public async Task <IEnumerable <Peer> > FindProvidersAsync( Cid id, int limit = 20, Action <Peer> action = null, CancellationToken cancel = default(CancellationToken)) { var dquery = new DistributedQuery <Peer> { QueryType = MessageType.GetProviders, QueryKey = id.Hash, Dht = this, AnswersNeeded = limit, }; if (action != null) { dquery.AnswerObtained += (s, e) => action.Invoke(e); } await dquery.RunAsync(cancel); return(dquery.Answers.Take(limit)); }