/// <summary> /// Occurs when a new entry is added/removed or merged into the presence list. /// </summary> /// <param name="value">The entry value.</param> /// <param name="source">The source node.</param> /// <param name="isMerging">Whether it is merging or not.</param> private void OnPresenceChange(ref ReplicatedDictionary <SubscriptionPresenceInfo> .Entry value, int source, bool isMerging) { if (!value.Deleted) { var data = value.Value; this.OnClientJoin(value.Value.AsInfo()); } else { this.OnClientLeave(value.Key); } }
/// <summary> /// Occurs when a new entry is being merged in the gossip. /// </summary> /// <param name="entry"></param> private void OnMembershipChange(ref ReplicatedDictionary <GossipMember> .Entry entry, int source, bool isMerging) { // We're only interested in merging changes if (!isMerging) { return; } // Skip ourselves var node = entry.Value; var key = node.EndPoint.ToIdentifier(); if (key == Service.Mesh.Identifier) { return; } // If the node was deleted, untrack it. if (entry.Deleted) { ForgetPeer(node.EndPoint); } else { // Do we have the peer in our registry? MeshMember item; if (Registry.TryGetValue(key, out item)) { // Parse the endpoint and touch the entry if (item.Identifier == source) { item.LastTouchUtc = Timer.UtcNow; } } else { try { // We've discovered a new node, track it TrackPeer(node.EndPoint); } catch (Exception ex) { // Log the parse exception Service.Logger.Log(ex); } } } }