예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }