using System.Threading.Channels; using Nexus.Api.Models; namespace Nexus.Api.Services; public interface IDomainEventStreamService { long CurrentSequence { get; } DomainEventSubscription Subscribe(IReadOnlySet channels); } public sealed class DomainEventSubscription( ChannelReader reader, long startingSequence, Func disposeAsync) : IAsyncDisposable { public ChannelReader Reader { get; } = reader; public long StartingSequence { get; } = startingSequence; public ValueTask DisposeAsync() => disposeAsync(); } public sealed class DomainEventSubscriberOverflowException : InvalidOperationException { public DomainEventSubscriberOverflowException() : base("The domain-event subscriber queue overflowed and requires a REST resync.") { } }