< Summary

Class:RPC.Services.CRDTServiceImpl
Assembly:RPC.Services.CRDTService
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/KernelCommunication/RPC/Services/CRDTService/CRDTServiceImpl.cs
Covered lines:31
Uncovered lines:7
Coverable lines:38
Total lines:97
Line coverage:81.5% (31 of 38)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CRDTServiceImpl()0%110100%
RegisterService(...)0%2100%
SendCrdt(...)0%5.045088.24%
PullCrdt(...)0%2.052076.92%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/KernelCommunication/RPC/Services/CRDTService/CRDTServiceImpl.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.IO;
 4using System.Threading;
 5using Cysharp.Threading.Tasks;
 6using DCL;
 7using DCL.CRDT;
 8using Google.Protobuf;
 9using KernelCommunication;
 10using rpc_csharp;
 11using UnityEngine;
 12using BinaryWriter = KernelCommunication.BinaryWriter;
 13
 14namespace RPC.Services
 15{
 16    public class CRDTServiceImpl : ICRDTService<RPCContext>
 17    {
 118        private static readonly UniTask<CRDTResponse> defaultResponse = UniTask.FromResult(new CRDTResponse());
 119        private static readonly UniTask<CRDTManyMessages> emptyResponse = UniTask.FromResult(new CRDTManyMessages() { Sc
 20
 121        private static readonly CRDTManyMessages reusableCrdtMessage = new CRDTManyMessages();
 22
 123        private static readonly CRDTStream crdtStream = new CRDTStream();
 124        private static readonly MemoryStream memoryStream = new MemoryStream();
 125        private static readonly BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 26
 27        public static void RegisterService(RpcServerPort<RPCContext> port)
 28        {
 029            CRDTServiceCodeGen.RegisterService(port, new CRDTServiceImpl());
 030        }
 31
 32        public UniTask<CRDTResponse> SendCrdt(CRDTManyMessages messages, RPCContext context, CancellationToken ct)
 33        {
 134            messages.Payload.WriteTo(crdtStream);
 35
 136            var sceneMessagesPool = context.crdtContext.messageQueueHandler.sceneMessagesPool;
 37
 38            try
 39            {
 140                using (var iterator = KernelBinaryMessageDeserializer.Deserialize(crdtStream))
 41                {
 242                    while (iterator.MoveNext())
 43                    {
 144                        if (!(iterator.Current is CRDTMessage crdtMessage))
 45                            continue;
 46
 147                        if (!sceneMessagesPool.TryDequeue(out QueuedSceneMessage_Scene queuedMessage))
 48                        {
 149                            queuedMessage = new QueuedSceneMessage_Scene();
 50                        }
 151                        queuedMessage.method = MessagingTypes.CRDT_MESSAGE;
 152                        queuedMessage.type = QueuedSceneMessage.Type.SCENE_MESSAGE;
 153                        queuedMessage.sceneId = messages.SceneId;
 154                        queuedMessage.payload = crdtMessage;
 55
 156                        context.crdtContext.messageQueueHandler.EnqueueSceneMessage(queuedMessage);
 57                    }
 158                }
 159            }
 60            catch (Exception e)
 61            {
 062                Debug.LogError(e);
 063            }
 64
 165            return defaultResponse;
 66        }
 67        public UniTask<CRDTManyMessages> PullCrdt(PullCRDTRequest request, RPCContext context, CancellationToken ct)
 68        {
 269            string sceneId = request.SceneId;
 70
 71            try
 72            {
 273                if (!context.crdtContext.scenesOutgoingCrdts.TryGetValue(sceneId, out CRDTProtocol sceneCrdtState))
 74                {
 075                    return emptyResponse;
 76                }
 77
 278                memoryStream.SetLength(0);
 79
 280                context.crdtContext.scenesOutgoingCrdts.Remove(sceneId);
 81
 282                KernelBinaryMessageSerializer.Serialize(binaryWriter, sceneCrdtState);
 283                sceneCrdtState.ClearOnUpdated();
 84
 285                reusableCrdtMessage.SceneId = sceneId;
 286                reusableCrdtMessage.Payload = ByteString.CopyFrom(memoryStream.ToArray());
 87
 288                return UniTask.FromResult(reusableCrdtMessage);
 89            }
 90            catch (Exception e)
 91            {
 092                Debug.LogError(e);
 093                return emptyResponse;
 94            }
 295        }
 96    }
 97}