public async IAsyncEnumerable <StoredEvent> QueryAllAsync(string?streamFilter = null, string?position = null, int take = int.MaxValue, [EnumeratorCancellation] CancellationToken ct = default) { if (take <= 0) { yield break; } var streamName = await projectionClient.CreateProjectionAsync(streamFilter); var stream = QueryAsync(streamName, position.ToPosition(false), take, ct); await foreach (var storedEvent in stream.IgnoreNotFound(ct)) { yield return(storedEvent); } }
public GetEventStoreSubscription( IEventSubscriber subscriber, EventStoreClient client, EventStoreProjectionClient projectionClient, IJsonSerializer serializer, string?position, string?prefix, string?streamFilter) { Task.Run(async() => { var ct = cts.Token; var streamName = await projectionClient.CreateProjectionAsync(streamFilter); async Task OnEvent(StreamSubscription subscription, ResolvedEvent @event, CancellationToken ct) { var storedEvent = Formatter.Read(@event, prefix, serializer); await subscriber.OnEventAsync(this, storedEvent); } void OnError(StreamSubscription subscription, SubscriptionDroppedReason reason, Exception? ex) { if (reason != SubscriptionDroppedReason.Disposed && reason != SubscriptionDroppedReason.SubscriberError) { ex ??= new InvalidOperationException($"Subscription closed with reason {reason}."); subscriber.OnErrorAsync(this, ex); } } if (!string.IsNullOrWhiteSpace(position)) { var streamPosition = position.ToPosition(true); subscription = await client.SubscribeToStreamAsync(streamName, streamPosition, OnEvent, true, OnError, cancellationToken: ct); } else { subscription = await client.SubscribeToStreamAsync(streamName, OnEvent, true, OnError, cancellationToken: ct); } }, cts.Token); }