< Summary

Class:DCL.Helpers.NFT.Markets.OpenSea_Internal.BatchAssetsRequestHandler
Assembly:OpenSea_Internal
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestHandlers/BatchAssetsRequestHandler.cs
Covered lines:41
Uncovered lines:35
Coverable lines:76
Total lines:192
Line coverage:53.9% (41 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
get_schedulableRequestHandler()0%110100%
BatchAssetsRequestHandler(...)0%220100%
AddRequest(...)0%2.032080%
CloseBatch()0%2.032080%
BatchOpenTimeOut()0%330100%
TryRetrySingleAsset()0%2100%
TryRetryBatchAssets()0%12300%
RetryBatch(...)0%6200%
GetUrl()0%110100%
SetApiResponse(...)0%9.89078.57%
CanRetry()0%6200%
Retry()0%12300%
SetApiResponseError(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestHandlers/BatchAssetsRequestHandler.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using System.Linq;
 5using UnityEngine;
 6
 7namespace DCL.Helpers.NFT.Markets.OpenSea_Internal
 8{
 9    internal class BatchAssetsRequestHandler : IRequestHandler
 10    {
 11        const bool VERBOSE = false;
 12        const float BATCH_OPEN_TIME = 2;
 13        const float QUERY_MAX_LENGTH = 1085; // maxUrl(1279) - apiUrl(37) - longestPossibleRequest (78 tokenId + 42 cont
 14
 015        public bool isOpen { private set; get; }
 16
 2417        SchedulableRequestHandler IRequestHandler.schedulableRequestHandler => schedulableHandler;
 18
 819        private readonly List<RequestAssetInBatch> requests = new List<RequestAssetInBatch>();
 20        private readonly RequestController requestController;
 821        private readonly SchedulableRequestHandler schedulableHandler = new SchedulableRequestHandler();
 22
 823        private string query = string.Empty;
 24        private int retryCount = 0;
 25
 826        public BatchAssetsRequestHandler(RequestController requestController, bool autocloseBatch = true)
 27        {
 28            if (VERBOSE)
 29                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) created");
 30
 831            this.requestController = requestController;
 832            this.isOpen = true;
 33
 834            if (autocloseBatch)
 835                CoroutineStarter.Start(BatchOpenTimeOut(BATCH_OPEN_TIME));
 836        }
 37
 38        public void AddRequest(RequestAssetInBatch request)
 39        {
 840            requests.Add(request);
 841            query += $"asset_contract_addresses={request.contractAddress}&token_ids={request.tokenId}&";
 42
 43            if (VERBOSE)
 44                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) adding {request.contractAddress}/{request.token
 45
 846            if (query.Length >= QUERY_MAX_LENGTH)
 47            {
 048                CloseBatch();
 49            }
 850        }
 51
 52        void CloseBatch()
 53        {
 54            if (VERBOSE)
 55                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) closed {query}");
 56
 757            isOpen = false;
 58
 759            if (string.IsNullOrEmpty(query))
 060                return;
 61
 762            schedulableHandler.SetReadyToBeScheduled(this);
 763        }
 64
 65        IEnumerator BatchOpenTimeOut(float openTime)
 66        {
 867            yield return WaitForSecondsCache.Get(openTime);
 768            CloseBatch();
 769        }
 70
 71        void TryRetrySingleAsset()
 72        {
 73            if (VERBOSE)
 74                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) retry single asset {query}");
 75
 076            requestController.requestScheduler.EnqueueRequest(this);
 077            retryCount ++;
 078        }
 79
 80        void TryRetryBatchAssets()
 81        {
 82            if (VERBOSE)
 83                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) retry splitting batch {query}");
 84
 85            // Split requests in new batches and retry
 086            int counter = 0;
 087            var batches = requests.GroupBy(x => counter++ % 2);
 88
 089            foreach (var group in batches)
 90            {
 091                RetryBatch(group.ToList());
 92            }
 093        }
 94
 95        void RetryBatch(List<RequestAssetInBatch> batchedRequests)
 96        {
 097            var newHandler = new BatchAssetsRequestHandler(requestController, false);
 098            for (int i = 0; i < batchedRequests.Count; i++)
 99            {
 0100                newHandler.AddRequest(batchedRequests[i]);
 101            }
 102
 0103            requestController.requestScheduler.EnqueueRequest(newHandler);
 0104            newHandler.schedulableHandler.SetReadyToBeScheduled(newHandler);
 0105        }
 106
 7107        string IRequestHandler.GetUrl() { return $"{Constants.MULTIPLE_ASSETS_URL}?{query}"; }
 108
 109        void IRequestHandler.SetApiResponse(string responseJson, Action onSuccess, Action<string> onError)
 110        {
 7111            AssetsResponse response = null;
 112
 113            try
 114            {
 7115                response = Utils.FromJsonWithNulls<AssetsResponse>(responseJson);
 7116            }
 0117            catch (Exception e)
 118            {
 0119                onError?.Invoke(e.Message);
 0120            }
 121
 7122            if (response == null)
 0123                return;
 124
 7125            RequestAssetInBatch request = null;
 7126            AssetResponse asset = null;
 127
 7128            int batchCount = requests.Count;
 28129            for (int i = batchCount - 1; i >= 0; i--)
 130            {
 7131                request = requests[i];
 14132                for (int j = 0; j < response.assets.Length; j++)
 133                {
 7134                    asset = response.assets[j];
 7135                    bool isMatch = asset.token_id == request.tokenId
 136                                   && String.Equals(asset.asset_contract.address, request.contractAddress, StringCompari
 137
 7138                    if (isMatch)
 139                    {
 140                        if (VERBOSE)
 141                            Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) resolved {request.contractAddress}/
 142
 7143                        request.Resolve(asset);
 7144                        requests.RemoveAt(i);
 7145                        break;
 146                    }
 147                }
 148            }
 149
 150            // Retry possible unresolved requests
 7151            if (requests.Count > 0)
 152            {
 0153                RetryBatch(requests);
 154            }
 155
 7156            onSuccess?.Invoke();
 7157        }
 158
 159        bool IRequestHandler.CanRetry()
 160        {
 0161            if (requests.Count == 1)
 0162                return retryCount < Constants.REQUESTS_RETRY_ATTEMPS;
 0163            return true;
 164        }
 165
 166        void IRequestHandler.Retry()
 167        {
 0168            if (requests.Count == 0)
 0169                return;
 170
 0171            if (requests.Count == 1)
 172            {
 0173                TryRetrySingleAsset();
 0174            }
 175            else
 176            {
 0177                TryRetryBatchAssets();
 178            }
 0179        }
 180
 181        void IRequestHandler.SetApiResponseError(string error)
 182        {
 183            if (VERBOSE)
 184                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) rejecting {error} {query}");
 185
 0186            for (int i = 0; i < requests.Count; i++)
 187            {
 0188                requests[i].Reject(error);
 189            }
 0190        }
 191    }
 192}