public async IAsyncEnumerable <IEvent> ReadAsync( StreamId streamId, StreamVersion fromVersion, StreamReadFilter?filter, [EnumeratorCancellation] CancellationToken cancellationToken) { var metadata = await metadataReader .GetAsync(streamId, cancellationToken) .ConfigureAwait(false); readValidator.Validate( metadata, filter?.RequiredVersion ?? StreamVersion.Any); // If we don't have any events in the stream, then skip reading from stream. if (metadata.Version == 0) { yield break; } await foreach (var evt in streamIterator .ReadAsync(streamId, fromVersion, filter, cancellationToken) .ConfigureAwait(false)) { yield return(evt); } }
public async ValueTask <IStreamState> ProjectAsync( TCommand command, ICommandHandler <TCommand> handler, CancellationToken cancellationToken) { var state = new StreamState { Id = command.GetEventStreamId().Value, Version = 0L, }; if (handlerMetadata.IsNotConsumingEvents()) { var metadata = await eventStore .GetStreamInfoAsync( state.Id, cancellationToken) .ConfigureAwait(false); readValidator.Validate( metadata, (StreamVersion?)command.RequiredVersion ?? StreamVersion.Any); state.Version = metadata.Version; return(state); } await foreach (var evt in eventStore .ReadFromStreamAsync( state.Id, (StreamVersion?)command.RequiredVersion ?? StreamVersion.Any, cancellationToken: cancellationToken) .ConfigureAwait(false)) { await handlerMetadata .ConsumeAsync( evt, handler, cancellationToken) .ConfigureAwait(false); state.Version = evt.Metadata.Version; } return(state); }