public void RegisterPeerConnection(ServicePeer peer) { UpdatePeerList(peer); UpdateSubscriptions(peer); UpdateShadows(peer); PeerConnected(peer); foreach (var subscription in peer.HandledMessages) { _endpointToStatus[subscription.Endpoint] = new EndpointStatus(subscription.Endpoint, true); } }
private void UpdateSubscriptions(ServicePeer peer) { foreach (var messageToEndpoint in peer.HandledMessages) { _messagesToEndpoints.AddOrUpdate(messageToEndpoint.MessageType.FullName, key => new List<MessageSubscription> { messageToEndpoint }, (key, oldValue) => { var list = new List<MessageSubscription>( oldValue.Where(x => x.Peer != peer.PeerId)); //dont keep previous message subscription from peer list.Add(messageToEndpoint); return list; }); } foreach (var pair in _messagesToEndpoints) //remove messages that are no longer handled { if (peer.HandledMessages.All(x => x.MessageType.FullName != pair.Key)) pair.Value.RemoveAll(x => x.Peer == peer.PeerId); } }
private void UpdatePeerList(ServicePeer peer) { _peers.AddOrUpdate(peer.PeerId, peer, (key, oldValue) => { return peer; }); }
public ServicePeerShadowInformation(ServicePeer servicePeer, bool isPersistenceProvider) { ServicePeer = servicePeer; IsPersistenceProvider = isPersistenceProvider; }
private void UpdateShadows(ServicePeer peer) { foreach (var shadowedPeer in peer.ShadowedPeers ?? Enumerable.Empty<ShadowedPeerConfiguration>()) { _peersToTheirShadows.AddOrUpdate(shadowedPeer.PeerPeerId, new HashSet<ServicePeerShadowInformation> { new ServicePeerShadowInformation(peer, shadowedPeer.IsPersistenceProvider) }, (key, oldValue) => { oldValue.Add(new ServicePeerShadowInformation(peer, shadowedPeer.IsPersistenceProvider)); return oldValue; }); } foreach (var pair in _peersToTheirShadows) { var previousEntry = pair.Value.SingleOrDefault(x => x.ServicePeer == peer); if (previousEntry != null && !peer.ShadowedPeers.Select(x => x.PeerPeerId).Contains(pair.Key)) pair.Value.Remove(previousEntry); } }