using System.Threading.Channels; using Microsoft.Extensions.Logging; using SatelliteProvider.Common.DTO; using SatelliteProvider.Common.Interfaces; namespace SatelliteProvider.Services; public class RegionRequestQueue : IRegionRequestQueue { private readonly Channel _queue; private readonly ILogger? _logger; private int _totalEnqueued = 0; private int _totalDequeued = 0; public RegionRequestQueue(int capacity, ILogger? logger = null) { var options = new BoundedChannelOptions(capacity) { FullMode = BoundedChannelFullMode.Wait }; _queue = Channel.CreateBounded(options); _logger = logger; _logger?.LogInformation("RegionRequestQueue created with capacity {Capacity}", capacity); } public async ValueTask EnqueueAsync(RegionRequest request, CancellationToken cancellationToken = default) { _totalEnqueued++; await _queue.Writer.WriteAsync(request, cancellationToken); } public async ValueTask DequeueAsync(CancellationToken cancellationToken = default) { if (await _queue.Reader.WaitToReadAsync(cancellationToken)) { if (_queue.Reader.TryRead(out var request)) { _totalDequeued++; return request; } } return null; } public int Count => _queue.Reader.Count; }