Example #1
0
 /// <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);
     }
 }
Example #2
0
        /// <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);
                    }
                }
            }
        }