< Summary

Class:ComponentCrdtWriteSystem
Assembly:ECS7Plugin.ComponentCrdtWriteSystem
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ComponentCrdtWriteSystem/ComponentCrdtWriteSystem.cs
Covered lines:43
Uncovered lines:7
Coverable lines:50
Total lines:117
Line coverage:86% (43 of 50)
Covered branches:0
Total branches:0

Metrics

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

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL;
 4using DCL.Controllers;
 5using DCL.CRDT;
 6using DCL.ECSRuntime;
 7using RPC;
 8
 9public class ComponentCrdtWriteSystem : IDisposable
 10{
 11    private class MessageData
 12    {
 13        public string sceneId;
 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 IWorldState worldState;
 24
 725    private readonly Dictionary<string, CRDTProtocol> outgoingCrdt = new Dictionary<string, CRDTProtocol>(60);
 726    private readonly Queue<MessageData> queuedMessages = new Queue<MessageData>(60);
 727    private readonly Queue<MessageData> messagesPool = new Queue<MessageData>(60);
 28
 729    public ComponentCrdtWriteSystem(IWorldState worldState, ISceneController sceneController, RPCContext rpcContext)
 30    {
 731        this.sceneController = sceneController;
 732        this.rpcContext = rpcContext;
 733        this.worldState = worldState;
 34
 735        sceneController.OnSceneRemoved += OnSceneRemoved;
 736    }
 37
 38    public void Dispose()
 39    {
 040        sceneController.OnSceneRemoved -= OnSceneRemoved;
 041    }
 42
 43    public void WriteMessage(string sceneId, long entityId, int componentId, byte[] data, long minTimeStamp, ECSComponen
 44    {
 845        MessageData messageData = messagesPool.Count > 0 ? messagesPool.Dequeue() : new MessageData();
 46
 847        messageData.sceneId = sceneId;
 848        messageData.entityId = entityId;
 849        messageData.componentId = componentId;
 850        messageData.data = data;
 851        messageData.writeType = writeType;
 852        messageData.minTimeStamp = minTimeStamp;
 53
 854        queuedMessages.Enqueue(messageData);
 855    }
 56
 57    public void LateUpdate()
 58    {
 859        int messagesCount = queuedMessages.Count;
 60
 861        if (messagesCount == 0)
 62        {
 063            return;
 64        }
 65
 3266        for (int i = 0; i < messagesCount; i++)
 67        {
 868            var message = queuedMessages.Dequeue();
 869            messagesPool.Enqueue(message);
 70
 871            if (!worldState.TryGetScene(message.sceneId, out IParcelScene scene))
 72                continue;
 73
 874            CRDTMessage crdt = scene.crdtExecutor.crdtProtocol.Create((int)message.entityId, message.componentId, messag
 875            if (message.minTimeStamp >= 0 && message.minTimeStamp > crdt.timestamp)
 76            {
 177                crdt.timestamp = message.minTimeStamp;
 78            }
 79
 880            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_LOCAL))
 81            {
 282                scene.crdtExecutor.Execute(crdt);
 283            }
 684            else if (message.writeType.HasFlag(ECSComponentWriteType.WRITE_STATE_LOCALLY))
 85            {
 386                scene.crdtExecutor.crdtProtocol.ProcessMessage(crdt);
 387            }
 388            else if (message.writeType.HasFlag(ECSComponentWriteType.EXECUTE_LOCALLY))
 89            {
 190                scene.crdtExecutor.ExecuteWithoutStoringState(crdt.key1, crdt.key2, crdt.data);
 91            }
 92
 893            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_SCENE))
 94            {
 295                if (!outgoingCrdt.TryGetValue(message.sceneId, out CRDTProtocol sceneCrdtState))
 96                {
 297                    sceneCrdtState = new CRDTProtocol();
 298                    outgoingCrdt[message.sceneId] = sceneCrdtState;
 99                }
 100
 2101                sceneCrdtState.ProcessMessage(crdt);
 102
 2103                if (!rpcContext.crdtContext.scenesOutgoingCrdts.ContainsKey(message.sceneId))
 104                {
 2105                    rpcContext.crdtContext.scenesOutgoingCrdts.Add(message.sceneId, sceneCrdtState);
 106                }
 107            }
 108        }
 8109    }
 110
 111    private void OnSceneRemoved(IParcelScene scene)
 112    {
 0113        string sceneId = scene.sceneData.id;
 0114        outgoingCrdt.Remove(sceneId);
 0115        rpcContext.crdtContext.scenesOutgoingCrdts.Remove(sceneId);
 0116    }
 117}