public void MessageReceived(IExtensionProtocolMessageReceivedContext context) { var message = context.Message as MetadataMessage; if (message == null) { throw new InvalidOperationException($"Expected a {nameof(MetadataMessage)} but received a {context.Message.GetType().Name}"); } }
public void MessageReceived(IExtensionProtocolMessageReceivedContext context) { var message = context.Message as PeerExchangeMessage; if (message == null) { throw new InvalidOperationException($"Expected a {nameof(PeerExchangeMessage)} but received a {context.Message.GetType().Name}"); } Log.LogDebug($"{message.Added.Count} peers received from PEX message"); context.PeersAvailable(message.Added.Select(CreateTransportStream)); }
public void MessageReceived(IExtensionProtocolMessageReceivedContext context) { var message = context.Message as PeerExchangeMessage; if (message == null) { throw new InvalidOperationException($"Expected a {nameof(PeerExchangeMessage)} but received a {context.Message.GetType().Name}"); } _logger.LogDebug($"{message.Added.Count} peers received from PEX message"); context.PeersAvailable(message.Added.Select(CreateTransportStream)); var metadata = context.GetValue <PeerExchangeMetadata>(PeerExchangeMetadata.Key) ?? new PeerExchangeMetadata(); if (DateTime.UtcNow.Subtract(metadata.LastMessageDate) >= TimeSpan.FromMinutes(1)) { var currentConnectedPeers = context.Peers.Select(p => p.Address); var addedPeers = currentConnectedPeers.Where(p => !metadata.ConnectedPeersSnapshot.Contains(p)); var droppedPeers = metadata.ConnectedPeersSnapshot.Where(p => !currentConnectedPeers.Contains(p)); if (!droppedPeers.Any() && !addedPeers.Any()) { return; } message = new PeerExchangeMessage { Added = ParseEndpoints(addedPeers), Dropped = ParseEndpoints(droppedPeers), }; context.SendMessage(message); metadata.LastMessageDate = DateTime.UtcNow; metadata.ConnectedPeersSnapshot = currentConnectedPeers; context.SetValue(PeerExchangeMetadata.Key, metadata); } }