< Summary

Class:MainScripts.DCL.ServiceProviders.OpenSea.RequestScheduler.RequestScheduler
Assembly:OpenSea_Internal
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/ServiceProviders/OpenSea/RequestScheduler/RequestScheduler.cs
Covered lines:1
Uncovered lines:22
Coverable lines:23
Total lines:69
Line coverage:4.3% (1 of 23)
Covered branches:0
Total branches:0
Covered methods:1
Total methods:5
Method coverage:20% (1 of 5)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
RequestScheduler()0%110100%
EnqueueRequest(...)0%6200%
OnRequestReadyToSchedule(...)0%12300%
SendRequest(...)0%6200%
ScheduleTaskRoutine()0%20400%

File(s)

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

#LineLine coverage
 1using MainScripts.DCL.ServiceProviders.OpenSea.RequestHandlers;
 2using System;
 3using System.Collections;
 4using System.Collections.Generic;
 5using UnityEngine;
 6
 7namespace MainScripts.DCL.ServiceProviders.OpenSea.RequestScheduler
 8{
 9    internal class RequestScheduler
 10    {
 11        const float REQUEST_DELAY = 0.4f; // max ~2 requests per second
 12
 13        public event Action<IRequestHandler> OnRequestReadyToSend;
 14
 13015        private readonly List<IRequestHandler> scheduledRequests = new List<IRequestHandler>();
 16
 17        private float lastRequestSentTime = 0;
 18        private Coroutine scheduleTask = null;
 19
 20        public void EnqueueRequest(IRequestHandler requests)
 21        {
 022            requests.schedulableRequestHandler.OnReadyToSchedule -= OnRequestReadyToSchedule;
 23
 024            if (requests.schedulableRequestHandler.isReadyToSchedule)
 25            {
 026                OnRequestReadyToSchedule(requests);
 27            }
 28            else
 29            {
 030                requests.schedulableRequestHandler.OnReadyToSchedule += OnRequestReadyToSchedule;
 31            }
 032        }
 33
 34        private void OnRequestReadyToSchedule(IRequestHandler requestHandler)
 35        {
 036            if (Time.unscaledTime - lastRequestSentTime >= REQUEST_DELAY)
 37            {
 038                SendRequest(requestHandler);
 039                return;
 40            }
 41
 042            scheduledRequests.Add(requestHandler);
 43
 044            if (scheduleTask == null)
 45            {
 046                scheduleTask = CoroutineStarter.Start(ScheduleTaskRoutine());
 47            }
 048        }
 49
 50        private void SendRequest(IRequestHandler requestHandler)
 51        {
 052            lastRequestSentTime = Time.unscaledTime;
 053            OnRequestReadyToSend?.Invoke(requestHandler);
 054        }
 55
 56        IEnumerator ScheduleTaskRoutine()
 57        {
 058            while (scheduledRequests.Count > 0)
 59            {
 060                float waitTime = Mathf.Clamp(REQUEST_DELAY - (Time.unscaledTime - lastRequestSentTime), 0, REQUEST_DELAY
 061                yield return WaitForSecondsCache.Get(waitTime);
 062                SendRequest(scheduledRequests[0]);
 063                scheduledRequests.RemoveAt(0);
 64            }
 65
 066            scheduleTask = null;
 067        }
 68    }
 69}