< 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:16
Uncovered lines:16
Coverable lines:32
Total lines:87
Line coverage:50% (16 of 32)
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%63.6410018.75%
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.IO;
 3using System.Threading;
 4using Cysharp.Threading.Tasks;
 5using DCL.CRDT;
 6using Google.Protobuf;
 7using KernelCommunication;
 8using rpc_csharp;
 9using UnityEngine;
 10using BinaryWriter = KernelCommunication.BinaryWriter;
 11
 12namespace RPC.Services
 13{
 14    public class CRDTServiceImpl : ICRDTService<RPCContext>
 15    {
 116        private static readonly CRDTResponse defaultResponse = new CRDTResponse();
 117        private static readonly UniTask<CRDTManyMessages> emptyResponse = UniTask.FromResult(new CRDTManyMessages() { Sc
 18
 119        private static readonly CRDTManyMessages reusableCrdtMessage = new CRDTManyMessages();
 20
 121        private static readonly MemoryStream memoryStream = new MemoryStream();
 122        private static readonly BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 23
 24        public static void RegisterService(RpcServerPort<RPCContext> port)
 25        {
 026            CRDTServiceCodeGen.RegisterService(port, new CRDTServiceImpl());
 027        }
 28
 29        public async UniTask<CRDTResponse> SendCrdt(CRDTManyMessages messages, RPCContext context, CancellationToken ct)
 30        {
 331            await UniTask.WaitWhile(() => context.crdtContext.MessagingControllersManager.HasScenePendingMessages(messag
 32                cancellationToken: ct);
 33
 034            await UniTask.SwitchToMainThread(ct);
 35
 36            try
 37            {
 038                using (var iterator = CRDTDeserializer.DeserializeBatch(messages.Payload.Memory))
 39                {
 040                    while (iterator.MoveNext())
 41                    {
 042                        if (!(iterator.Current is CRDTMessage crdtMessage))
 43                            continue;
 44
 045                        context.crdtContext.CrdtMessageReceived?.Invoke(messages.SceneId, crdtMessage);
 46                    }
 047                }
 048            }
 49            catch (Exception e)
 50            {
 051                Debug.LogError(e);
 052            }
 53
 054            return defaultResponse;
 055        }
 56
 57        public UniTask<CRDTManyMessages> PullCrdt(PullCRDTRequest request, RPCContext context, CancellationToken ct)
 58        {
 259            string sceneId = request.SceneId;
 60
 61            try
 62            {
 263                if (!context.crdtContext.scenesOutgoingCrdts.TryGetValue(sceneId, out CRDTProtocol sceneCrdtState))
 64                {
 065                    return emptyResponse;
 66                }
 67
 268                memoryStream.SetLength(0);
 69
 270                context.crdtContext.scenesOutgoingCrdts.Remove(sceneId);
 71
 272                KernelBinaryMessageSerializer.Serialize(binaryWriter, sceneCrdtState);
 273                sceneCrdtState.ClearOnUpdated();
 74
 275                reusableCrdtMessage.SceneId = sceneId;
 276                reusableCrdtMessage.Payload = ByteString.CopyFrom(memoryStream.ToArray());
 77
 278                return UniTask.FromResult(reusableCrdtMessage);
 79            }
 80            catch (Exception e)
 81            {
 082                Debug.LogError(e);
 083                return emptyResponse;
 84            }
 285        }
 86    }
 87}