Exemplo n.º 1
0
 public void EnqueueChangeForBroadcast(ChangeToBroadcast ctb)
 {
     lock (broadcastQueue)
     {
         broadcastQueue.Add(ctb);
         loopEvent.Set();
     }
 }
Exemplo n.º 2
0
        public Task BroadcastChange(ChangeToBroadcast ctb)
        {
            List <Task> tasks  = new List <Task>();
            string      updMsg = "UPDATE " + ctb.NewDocRevisionId + " " + ctb.SourceSessionKey + " " + ctb.SelJson;

            if (ctb.ChangeJson != null)
            {
                updMsg += " " + ctb.ChangeJson;
            }
            string ackMsg = "ACKCHANGE " + ctb.SourceBaseDocRevisionId + " " + ctb.NewDocRevisionId;

            lock (conns)
            {
                // Propagate to all provided session keys, except sender herself
                ManagedConnection senderConn = null;
                foreach (var x in conns)
                {
                    if (x.SessionKey == ctb.SourceSessionKey)
                    {
                        senderConn = x;
                    }
                    if (!ctb.ReceiverSessionKeys.Contains(x.SessionKey) || x.SessionKey == ctb.SourceSessionKey)
                    {
                        continue;
                    }
                    tasks.Add(x.WSC.SendAsync(updMsg, CancellationToken.None));
                }
                // Acknowledge change to sender: but only for actual content changes!
                // We're not acknowledging selection changes, as those don't change revision ID
                if (senderConn != null && ctb.ChangeJson != null)
                {
                    tasks.Add(senderConn.WSC.SendAsync(ackMsg, CancellationToken.None));
                }
            }
            return(Task.WhenAll(tasks));
        }