private Protobuf.ReplicationMessage GetNextMessage()
 {
     if (nextMessage == null)
     {
         nextMessage = new Protobuf.ReplicationMessage();
     }
     return(nextMessage);
 }
        void IReplicationStreamWriter.WriteTo(Stream stream)
        {
            WriteUpdates(GetNextMessage());

            if (nextMessage != null)
            {
                nextMessage.WriteTo(stream);
                nextMessage = null;
            }
        }
        private void WriteRemove(Protobuf.ReplicationMessage message, Replica replica)
        {
            var removeMessage = new Protobuf.RemoveMessage()
            {
                ReplicaId = replica.Id
            };

            message.Actions.Add(new Protobuf.ReplicationMessage.Types.ActionMessage()
            {
                Remove = removeMessage
            });
        }
        private void WriteRemoteCall(Protobuf.ReplicationMessage message, FunctionId functionId, IMessage argument)
        {
            var remoteCallMessage = new Protobuf.RemoteCallMessage()
            {
                FunctionId = functionId,
                TypeId     = system.GetTypeId(argument.GetType()),
                Argument   = argument.ToByteString()
            };

            message.Actions.Add(new Protobuf.ReplicationMessage.Types.ActionMessage()
            {
                RemoteCall = remoteCallMessage
            });
        }
        private void WriteAdd(Protobuf.ReplicationMessage message, Replica replica)
        {
            var addMessage = new Protobuf.AddMessage()
            {
                TypeId    = system.GetTypeId(replica.Value.GetType()),
                ReplicaId = replica.Id.Value,
                Replica   = replica.Value.ToByteString()
            };

            message.Actions.Add(new Protobuf.ReplicationMessage.Types.ActionMessage()
            {
                Add = addMessage
            });
        }
        private void WriteUpdate(Protobuf.ReplicationMessage message, Replica replica)
        {
            var value = replica.Value.ToByteString();

            if (options.AllowDifferentOnly && replica.DifferentOnly)
            {
                if (lastValues.TryGetValue(replica.Id, out ByteString lastState) && value.Equals(lastState))
                {
                    // Identical to last state, skip it
                    return;
                }
                lastValues[replica.Id] = value;
            }

            var updateMessage = new Protobuf.UpdateMessage();

            updateMessage.ReplicaId = replica.Id;
            updateMessage.Replica   = value;
            message.Updates.Add(updateMessage);
        }
        private void WriteUpdates(Protobuf.ReplicationMessage message)
        {
            IEnumerable <Replica> replicas = updated;

            if (options.AllowAlwaysUpdate)
            {
                replicas = replicas.Concat(system.Replicas.Where(r => (!options.MasterOnly || r.Master) && r.AlwaysUpdate));
            }

            if (options.Culling != null)
            {
                replicas = replicas.Where(d => options.Culling(d));
            }

            foreach (var replica in replicas)
            {
                WriteUpdate(message, replica);
            }

            updated.Clear();
        }