public IDisposable RegisterPeerTableRepository(PeerTableRepository peerTableRepository) { var poll = new EventLoopMessageListener <object>(o => { var message = o as IncomingMessage; if (message != null) { if (message.Message.Payload is AddrPayload) { peerTableRepository.WritePeers(((AddrPayload)message.Message.Payload).Addresses .Where(a => a.Endpoint.Address.IsRoutable(AllowLocalPeers)) .Select(a => new Peer(PeerOrigin.Addr, a))); } } var peer = o as Peer; if (peer != null) { if (peer.NetworkAddress.Endpoint.Address.IsRoutable(AllowLocalPeers)) { peerTableRepository.WritePeer(peer); } } }); if (peerTableRepository != _PeerTable) { _InternalMessageProducer.PushMessages(peerTableRepository.GetPeers()); } return(new CompositeDisposable(AllMessages.AddMessageListener(poll), _InternalMessageProducer.AddMessageListener(poll), OwnResource(poll))); }
public IDisposable RegisterPeerTableRepository(PeerTableRepository peerTableRepository) { var poll = new EventLoopMessageListener<object>(o => { var message = o as IncomingMessage; if(message != null) { if(message.Message.Payload is AddrPayload) { peerTableRepository.WritePeers(((AddrPayload)message.Message.Payload).Addresses .Where(a => a.Endpoint.Address.IsRoutable(AllowLocalPeers)) .Select(a => new Peer(PeerOrigin.Addr, a))); } } var peer = o as Peer; if(peer != null) { if(peer.NetworkAddress.Endpoint.Address.IsRoutable(AllowLocalPeers)) peerTableRepository.WritePeer(peer); } }); if(peerTableRepository != _PeerTable) { _InternalMessageProducer.PushMessages(peerTableRepository.GetPeers()); } return new CompositeDisposable(AllMessages.AddMessageListener(poll), _InternalMessageProducer.AddMessageListener(poll), OwnResource(poll)); }
private static void CanStorePeer(PeerTableRepository repository) { var peer = new Peer(PeerOrigin.Addr, new NetworkAddress() { Endpoint = new IPEndPoint(IPAddress.Parse("0.0.1.0").MapToIPv6(), 110), Time = DateTimeOffset.UtcNow - TimeSpan.FromMinutes(5) }); repository.WritePeer(peer); var result = repository.GetPeers().ToArray(); Assert.Equal(1, result.Length); Assert.Equal(PeerOrigin.Addr, result[0].Origin); Assert.Equal(IPAddress.Parse("0.0.1.0").MapToIPv6(), result[0].NetworkAddress.Endpoint.Address); Assert.Equal(110, result[0].NetworkAddress.Endpoint.Port); Assert.Equal(peer.NetworkAddress.Time, result[0].NetworkAddress.Time); peer.NetworkAddress.Time = DateTimeOffset.UtcNow + TimeSpan.FromMinutes(5); repository.WritePeer(peer); result = repository.GetPeers().ToArray(); Assert.Equal(1, result.Length); Assert.Equal(peer.NetworkAddress.Time, result[0].NetworkAddress.Time); var peer2 = new Peer(PeerOrigin.Addr, new NetworkAddress() { Endpoint = new IPEndPoint(IPAddress.Parse("0.0.2.0").MapToIPv6(), 110), Time = DateTimeOffset.UtcNow - TimeSpan.FromMinutes(5) }); repository.WritePeers(new Peer[] { peer, peer2 }); Assert.Equal(2, repository.GetPeers().ToArray().Length); peer.NetworkAddress.Time = Utils.UnixTimeToDateTime(0); repository.WritePeer(peer); result = repository.GetPeers().ToArray(); Assert.Equal(1, result.Length); Assert.Equal(IPAddress.Parse("0.0.2.0").MapToIPv6(), result[0].NetworkAddress.Endpoint.Address); }