< Summary

Class:ComponentCrdtWriteSystem
Assembly:ECS7Plugin.ComponentCrdtWriteSystem
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ComponentCrdtWriteSystem/ComponentCrdtWriteSystem.cs
Covered lines:47
Uncovered lines:0
Coverable lines:47
Total lines:118
Line coverage:100% (47 of 47)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ComponentCrdtWriteSystem(...)0%110100%
Dispose()0%110100%
WriteMessage(...)0%220100%
LateUpdate()0%12120100%
OnSceneRemoved(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ComponentCrdtWriteSystem/ComponentCrdtWriteSystem.cs

#LineLine coverage
 1using DCL;
 2using DCL.Controllers;
 3using DCL.CRDT;
 4using DCL.ECSRuntime;
 5using RPC;
 6using System;
 7using System.Collections.Generic;
 8
 9public class ComponentCrdtWriteSystem : IDisposable
 10{
 11    private class MessageData
 12    {
 13        public int sceneNumber;
 14        public long entityId;
 15        public int componentId;
 16        public byte[] data;
 17        public long minTimeStamp;
 18        public ECSComponentWriteType writeType;
 19    }
 20
 21    private readonly RPCContext rpcContext;
 22    private readonly ISceneController sceneController;
 23    private readonly IReadOnlyDictionary<int, ICRDTExecutor> crdtExecutors;
 24
 925    private readonly Dictionary<int, CRDTProtocol> outgoingCrdt = new Dictionary<int, CRDTProtocol>(60);
 926    private readonly Queue<MessageData> queuedMessages = new Queue<MessageData>(60);
 927    private readonly Queue<MessageData> messagesPool = new Queue<MessageData>(60);
 28
 929    public ComponentCrdtWriteSystem(IReadOnlyDictionary<int, ICRDTExecutor> crdtExecutors, ISceneController sceneControl
 30    {
 931        this.sceneController = sceneController;
 932        this.rpcContext = rpcContext;
 933        this.crdtExecutors = crdtExecutors;
 34
 935        sceneController.OnSceneRemoved += OnSceneRemoved;
 936    }
 37
 38    public void Dispose()
 39    {
 240        sceneController.OnSceneRemoved -= OnSceneRemoved;
 241    }
 42
 43    public void WriteMessage(int sceneNumber, long entityId, int componentId, byte[] data, long minTimeStamp,
 44        ECSComponentWriteType writeType)
 45    {
 3246        MessageData messageData = messagesPool.Count > 0 ? messagesPool.Dequeue() : new MessageData();
 47
 3248        messageData.sceneNumber = sceneNumber;
 3249        messageData.entityId = entityId;
 3250        messageData.componentId = componentId;
 3251        messageData.data = data;
 3252        messageData.writeType = writeType;
 3253        messageData.minTimeStamp = minTimeStamp;
 54
 3255        queuedMessages.Enqueue(messageData);
 3256    }
 57
 58    public void LateUpdate()
 59    {
 2160        int messagesCount = queuedMessages.Count;
 61
 2162        if (messagesCount == 0)
 63        {
 464            return;
 65        }
 66
 9867        for (int i = 0; i < messagesCount; i++)
 68        {
 3269            var message = queuedMessages.Dequeue();
 3270            messagesPool.Enqueue(message);
 71
 3272            if (!crdtExecutors.TryGetValue(message.sceneNumber, out ICRDTExecutor crdtExecutor))
 73                continue;
 74
 3275            CRDTMessage crdt = crdtExecutor.crdtProtocol.Create((int)message.entityId, message.componentId, message.data
 76
 3277            if (message.minTimeStamp >= 0 && message.minTimeStamp > crdt.timestamp)
 78            {
 279                crdt.timestamp = message.minTimeStamp;
 80            }
 81
 3282            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_LOCAL))
 83            {
 484                crdtExecutor.Execute(crdt);
 85            }
 2886            else if (message.writeType.HasFlag(ECSComponentWriteType.WRITE_STATE_LOCALLY))
 87            {
 388                crdtExecutor.crdtProtocol.ProcessMessage(crdt);
 89            }
 2590            else if (message.writeType.HasFlag(ECSComponentWriteType.EXECUTE_LOCALLY))
 91            {
 392                crdtExecutor.ExecuteWithoutStoringState(crdt.key1, crdt.key2, crdt.data);
 93            }
 94
 3295            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_SCENE))
 96            {
 2497                if (!outgoingCrdt.TryGetValue(message.sceneNumber, out CRDTProtocol sceneCrdtState))
 98                {
 499                    sceneCrdtState = new CRDTProtocol();
 4100                    outgoingCrdt[message.sceneNumber] = sceneCrdtState;
 101                }
 102
 24103                sceneCrdtState.ProcessMessage(crdt);
 104
 24105                if (!rpcContext.crdt.scenesOutgoingCrdts.ContainsKey(message.sceneNumber))
 106                {
 4107                    rpcContext.crdt.scenesOutgoingCrdts.Add(message.sceneNumber, sceneCrdtState);
 108                }
 109            }
 110        }
 17111    }
 112
 113    private void OnSceneRemoved(IParcelScene scene)
 114    {
 1115        outgoingCrdt.Remove(scene.sceneData.sceneNumber);
 1116        rpcContext.crdt.scenesOutgoingCrdts.Remove(scene.sceneData.sceneNumber);
 1117    }
 118}