using System.Collections.Concurrent; using System.Threading.Channels; using StellaOps.TimelineIndexer.Core.Abstractions; using StellaOps.TimelineIndexer.Core.Models; namespace StellaOps.TimelineIndexer.Tests; public sealed class InMemoryTimelineEventSubscriber : ITimelineEventSubscriber { private readonly Channel _channel; public InMemoryTimelineEventSubscriber(IEnumerable? seed = null) { _channel = Channel.CreateUnbounded(new UnboundedChannelOptions { SingleReader = false, SingleWriter = false }); if (seed is not null) { foreach (var envelope in seed) { _channel.Writer.TryWrite(envelope); } _channel.Writer.TryComplete(); } } public void Enqueue(TimelineEventEnvelope envelope) { _channel.Writer.TryWrite(envelope); } public void Complete() => _channel.Writer.TryComplete(); public IAsyncEnumerable SubscribeAsync(CancellationToken cancellationToken = default) { return _channel.Reader.ReadAllAsync(cancellationToken); } }