< Summary

Class:DCL.Social.Friends.RPCSocialClientProvider
Assembly:FriendsController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/FriendsController/RPCSocialClientProvider.cs
Covered lines:5
Uncovered lines:41
Coverable lines:46
Total lines:109
Line coverage:10.8% (5 of 46)
Covered branches:0
Total branches:0
Covered methods:1
Total methods:3
Method coverage:33.3% (1 of 3)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
RPCSocialClientProvider(...)0%110100%
Provide()0%1561200%
CreateWebSocketAndConnect(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/FriendsController/RPCSocialClientProvider.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using Decentraland.Social.Friendships;
 3using rpc_csharp;
 4using rpc_csharp.transport;
 5using RPC.Transports;
 6using System;
 7using System.Threading;
 8using UnityEngine;
 9
 10namespace DCL.Social.Friends
 11{
 12    public class RPCSocialClientProvider : ISocialClientProvider
 13    {
 14        private const string RPC_URL = "wss://rpc-social-service.decentraland";
 15        private const string MAIN_NET = "mainnet";
 16
 17        private readonly KernelConfig kernelConfig;
 18
 42319        private string url = $"{RPC_URL}.org";
 42320        private string network = MAIN_NET;
 21
 22        public event Action OnTransportError;
 23
 42324        public RPCSocialClientProvider(KernelConfig kernelConfig)
 25        {
 42326            this.kernelConfig = kernelConfig;
 42327        }
 28
 29        public async UniTask<IClientFriendshipsService> Provide(CancellationToken cancellationToken)
 30        {
 031            await kernelConfig.EnsureConfigInitialized();
 032            string currentNetwork = kernelConfig.Get().network;
 033            if (!currentNetwork.Equals(network, StringComparison.OrdinalIgnoreCase))
 34            {
 035                string tld = currentNetwork.Equals(MAIN_NET, StringComparison.OrdinalIgnoreCase) ? ".org" : ".zone";
 036                url = $"{RPC_URL}{tld}";
 037                network = currentNetwork;
 38            }
 39
 040            var transport = await CreateWebSocketAndConnect(cancellationToken);
 041            var client = new RpcClient(transport);
 042            var socialPort = await client.CreatePort("social-service-port");
 43
 044            cancellationToken.ThrowIfCancellationRequested();
 45
 046            var module = await socialPort.LoadModule(FriendshipsServiceCodeGen.ServiceName);
 47
 048            cancellationToken.ThrowIfCancellationRequested();
 49
 050            return new ClientFriendshipsService(module);
 051        }
 52
 53        private UniTask<ITransport> CreateWebSocketAndConnect(CancellationToken cancellationToken)
 54        {
 055            UniTaskCompletionSource<ITransport> task = new ();
 056            WebSocketClientTransport transport = new (url);
 57
 58            void CompleteTaskAndUnsubscribe()
 59            {
 060                Debug.Log("SocialClient.Transport.Connected");
 61
 062                if (cancellationToken.IsCancellationRequested)
 63                {
 064                    task.TrySetCanceled(cancellationToken);
 065                    return;
 66                }
 67
 068                task.TrySetResult(transport);
 069            }
 70
 71            void FailTaskAndUnsubscribe(string error)
 72            {
 073                Debug.LogError($"SocialClient.Transport.Error: {error}");
 74
 075                if (cancellationToken.IsCancellationRequested)
 76                {
 077                    task.TrySetCanceled(cancellationToken);
 078                    return;
 79                }
 80
 081                task.TrySetException(new Exception(error));
 82
 083                OnTransportError?.Invoke();
 084            }
 85
 86            void FailTaskByDisconnectionAndUnsubscribe()
 87            {
 088                Debug.Log("SocialClient.Transport.Disconnected");
 89
 090                if (cancellationToken.IsCancellationRequested)
 91                {
 092                    task.TrySetCanceled(cancellationToken);
 093                    return;
 94                }
 95
 096                task.TrySetException(new Exception("Cannot connect to social service server, connection closed"));
 097            }
 98
 099            transport.OnConnectEvent += CompleteTaskAndUnsubscribe;
 0100            transport.OnErrorEvent += FailTaskAndUnsubscribe;
 0101            transport.OnCloseEvent += FailTaskByDisconnectionAndUnsubscribe;
 102
 0103            try { transport.Connect(); }
 0104            catch (Exception e) { Debug.LogException(e); }
 105
 0106            return task.Task.AttachExternalCancellation(cancellationToken);
 107        }
 108    }
 109}