public void UniqueId()
        {
            var q1 = new DistributedQuery <Peer>();
            var q2 = new DistributedQuery <Peer>();

            Assert.AreNotEqual(q1.Id, q2.Id);
        }
Beispiel #2
0
        /// <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());
        }
Beispiel #3
0
        /// <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());
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        /// <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));
        }
Beispiel #6
0
        /// <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));
        }