< Summary

Class:ComponentCrdtWriteSystem
Assembly:ECS7Plugin.ComponentCrdtWriteSystem
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ComponentCrdtWriteSystem/ComponentCrdtWriteSystem.cs
Covered lines:36
Uncovered lines:7
Coverable lines:43
Total lines:107
Line coverage:83.7% (36 of 43)
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%8.018095.45%
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 ECSComponentWriteType writeType;
 18    }
 19
 20    private readonly RPCContext rpcContext;
 21    private readonly ISceneController sceneController;
 22    private readonly IWorldState worldState;
 23
 524    private readonly Dictionary<string, CRDTProtocol> outgoingCrdt = new Dictionary<string, CRDTProtocol>(60);
 525    private readonly Queue<MessageData> queuedMessages = new Queue<MessageData>(60);
 526    private readonly Queue<MessageData> messagesPool = new Queue<MessageData>(60);
 27
 528    public ComponentCrdtWriteSystem(IWorldState worldState, ISceneController sceneController, RPCContext rpcContext)
 29    {
 530        this.sceneController = sceneController;
 531        this.rpcContext = rpcContext;
 532        this.worldState = worldState;
 33
 534        sceneController.OnSceneRemoved += OnSceneRemoved;
 535    }
 36
 37    public void Dispose()
 38    {
 039        sceneController.OnSceneRemoved -= OnSceneRemoved;
 040    }
 41
 42    public void WriteMessage(string sceneId, long entityId, int componentId, byte[] data, ECSComponentWriteType writeTyp
 43    {
 544        MessageData messageData = messagesPool.Count > 0 ? messagesPool.Dequeue() : new MessageData();
 45
 546        messageData.sceneId = sceneId;
 547        messageData.entityId = entityId;
 548        messageData.componentId = componentId;
 549        messageData.data = data;
 550        messageData.writeType = writeType;
 51
 552        queuedMessages.Enqueue(messageData);
 553    }
 54
 55    public void LateUpdate()
 56    {
 557        int messagesCount = queuedMessages.Count;
 58
 559        if (messagesCount == 0)
 60        {
 061            return;
 62        }
 63
 2064        for (int i = 0; i < messagesCount; i++)
 65        {
 566            var message = queuedMessages.Dequeue();
 567            messagesPool.Enqueue(message);
 68
 569            if (!worldState.TryGetScene(message.sceneId, out IParcelScene scene))
 70                continue;
 71
 572            CRDTMessage crdt = scene.crdtExecutor.crdtProtocol.Create((int)message.entityId, message.componentId, messag
 73
 574            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_LOCAL))
 75            {
 276                scene.crdtExecutor.Execute(crdt);
 277            }
 78            else
 79            {
 380                scene.crdtExecutor.crdtProtocol.ProcessMessage(crdt);
 81            }
 82
 583            if (message.writeType.HasFlag(ECSComponentWriteType.SEND_TO_SCENE))
 84            {
 385                if (!outgoingCrdt.TryGetValue(message.sceneId, out CRDTProtocol sceneCrdtState))
 86                {
 387                    sceneCrdtState = new CRDTProtocol();
 388                    outgoingCrdt[message.sceneId] = sceneCrdtState;
 89                }
 90
 391                sceneCrdtState.ProcessMessage(crdt);
 92
 393                if (!rpcContext.crdtContext.scenesOutgoingCrdts.ContainsKey(message.sceneId))
 94                {
 395                    rpcContext.crdtContext.scenesOutgoingCrdts.Add(message.sceneId, sceneCrdtState);
 96                }
 97            }
 98        }
 599    }
 100
 101    private void OnSceneRemoved(IParcelScene scene)
 102    {
 0103        string sceneId = scene.sceneData.id;
 0104        outgoingCrdt.Remove(sceneId);
 0105        rpcContext.crdtContext.scenesOutgoingCrdts.Remove(sceneId);
 0106    }
 107}