42 lines
1.2 KiB
C#
42 lines
1.2 KiB
C#
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<TimelineEventEnvelope> _channel;
|
|
|
|
public InMemoryTimelineEventSubscriber(IEnumerable<TimelineEventEnvelope>? seed = null)
|
|
{
|
|
_channel = Channel.CreateUnbounded<TimelineEventEnvelope>(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<TimelineEventEnvelope> SubscribeAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
return _channel.Reader.ReadAllAsync(cancellationToken);
|
|
}
|
|
}
|