Example #1
0
        private StreamSubscription SubscribeToStream(string streamName,
                                                     StreamRevision start,
                                                     Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                                     EventStoreClientOperationOptions operationOptions,
                                                     bool resolveLinkTos = false,
                                                     Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                                     UserCredentials userCredentials     = default,
                                                     CancellationToken cancellationToken = default)
        {
            operationOptions.TimeoutAfter = DeadLine.None;

            var subscription = new StreamSubscription(ReadInternal(new ReadReq {
                Options = new ReadReq.Types.Options {
                    ReadDirection = ReadReq.Types.Options.Types.ReadDirection.Forwards,
                    ResolveLinks  = resolveLinkTos,
                    Stream        = ReadReq.Types.Options.Types.StreamOptions.FromStreamNameAndRevision(streamName,
                                                                                                        start),
                    Subscription = new ReadReq.Types.Options.Types.SubscriptionOptions()
                }
            },
                                                                   operationOptions, userCredentials, cancellationToken), eventAppeared,
                                                      subscriptionDropped);

            return(subscription);
        }
        public void ImplicitConversionFromStreamRevisionReturnsExpectedResult()
        {
            const ulong value  = 0UL;
            ulong       actual = new StreamRevision(value);

            Assert.Equal(value, actual);
        }
        private Task <StreamSubscription> SubscribeToStreamAsync(string streamName,
                                                                 StreamRevision start,
                                                                 Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                                                 EventStoreClientOperationOptions operationOptions,
                                                                 bool resolveLinkTos = false,
                                                                 Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                                                 UserCredentials userCredentials     = default,
                                                                 CancellationToken cancellationToken = default)
        {
            operationOptions.TimeoutAfter = DeadLine.None;

            return(StreamSubscription.Confirm(ReadInternal(new ReadReq {
                Options = new ReadReq.Types.Options {
                    ReadDirection = ReadReq.Types.Options.Types.ReadDirection.Forwards,
                    ResolveLinks = resolveLinkTos,
                    Stream = start == StreamRevision.End
                                                                ? new ReadReq.Types.Options.Types.StreamOptions {
                        End = new Empty(),
                        StreamName = streamName
                    }
                                                                : new ReadReq.Types.Options.Types.StreamOptions {
                        Revision = start,
                        StreamName = streamName
                    },
                    Subscription = new ReadReq.Types.Options.Types.SubscriptionOptions()
                }
            },
                                                           operationOptions, userCredentials, cancellationToken), eventAppeared, subscriptionDropped, _log,
                                              cancellationToken: cancellationToken));
        }
        public async Task <IWriteResult> AppendToStreamAsync(
            string streamName,
            StreamRevision expectedRevision,
            IEnumerable <EventData> eventData,
            Action <EventStoreClientOperationOptions>?configureOperationOptions = null,
            UserCredentials?userCredentials     = null,
            CancellationToken cancellationToken = default)
        {
            var options = Settings.OperationOptions.Clone();

            configureOperationOptions?.Invoke(options);

            _log.LogDebug("Append to stream - {streamName}@{expectedRevision}.", streamName, expectedRevision);

            var task =
#if NET5_0_OR_GREATER
                userCredentials == null
                                        ? _streamAppender.Append(streamName, expectedRevision, eventData, options.TimeoutAfter,
                                                                 cancellationToken)
                                        :
#endif
                AppendToStreamInternal(new AppendReq {
                Options = new AppendReq.Types.Options {
                    StreamIdentifier = streamName,
                    Revision         = expectedRevision
                }
            }, eventData, options, userCredentials, cancellationToken);

            return((await task.ConfigureAwait(false)).OptionallyThrowWrongExpectedVersionException(options));
        }
        public void SubtractionOperator()
        {
            var sut = new StreamRevision(1);

            Assert.Equal(new StreamRevision(0), sut - 1);
            Assert.Equal(new StreamRevision(0), 1 - sut);
        }
        public void AdditionOperator()
        {
            var sut = new StreamRevision(0);

            Assert.Equal(new StreamRevision(1), sut + 1);
            Assert.Equal(new StreamRevision(1), 1 + sut);
        }
        public void ImplicitConversionToStreamRevisionReturnsExpectedResult()
        {
            const ulong    value    = 0UL;
            var            expected = new StreamRevision(value);
            StreamRevision actual   = value;

            Assert.Equal(expected, actual);
        }
 /// <summary>
 /// Appends events asynchronously to a stream.
 /// </summary>
 /// <param name="streamName">The name of the stream to append events to.</param>
 /// <param name="expectedRevision">The expected <see cref="StreamRevision"/> of the stream to append to.</param>
 /// <param name="eventData">An <see cref="IEnumerable{EventData}"/> to append to the stream.</param>
 /// <param name="userCredentials">The <see cref="UserCredentials"/> for the operation.</param>
 /// <param name="cancellationToken">The optional <see cref="System.Threading.CancellationToken"/>.</param>
 /// <returns></returns>
 public Task <WriteResult> AppendToStreamAsync(
     string streamName,
     StreamRevision expectedRevision,
     IEnumerable <EventData> eventData,
     UserCredentials userCredentials     = default,
     CancellationToken cancellationToken = default) =>
 AppendToStreamAsync(streamName, expectedRevision, eventData, _settings.OperationOptions,
                     userCredentials, cancellationToken);
Example #9
0
 private ConditionalWriteResult(StreamRevision nextExpectedStreamRevision, Position logPosition,
                                ConditionalWriteStatus status = ConditionalWriteStatus.Succeeded)
 {
     NextExpectedStreamRevision = nextExpectedStreamRevision;
     NextExpectedVersion        = nextExpectedStreamRevision.ToInt64();
     LogPosition = logPosition;
     Status      = status;
 }
 public WrongExpectedVersionException(string streamName, StreamState expectedStreamState,
                                      StreamRevision actualStreamRevision, Exception?exception = null) : base(
         $"Append failed due to WrongExpectedVersion. Stream: {streamName}, Expected state: {expectedStreamState}, Actual version: {actualStreamRevision}",
         exception)
 {
     StreamName           = streamName;
     ActualStreamRevision = actualStreamRevision;
     ActualVersion        = actualStreamRevision == StreamRevision.None ? new long?() : actualStreamRevision.ToInt64();
 }
 private Task <IWriteResult> SetStreamMetadataAsync(string streamName, StreamRevision expectedRevision,
                                                    StreamMetadata metadata, EventStoreClientOperationOptions operationOptions,
                                                    UserCredentials?userCredentials = null, CancellationToken cancellationToken = default)
 => SetStreamMetadataInternal(metadata, new AppendReq {
     Options = new AppendReq.Types.Options {
         StreamName = SystemStreams.MetastreamOf(streamName),
         Revision   = expectedRevision
     }
 }, operationOptions, userCredentials, cancellationToken);
Example #12
0
 /// <summary>
 /// Subscribes to a stream from a checkpoint. This is exclusive of.
 /// </summary>
 /// <param name="start">A <see cref="Position"/> (exclusive of) to start the subscription from.</param>
 /// <param name="streamName">The name of the stream to read events from.</param>
 /// <param name="eventAppeared">A Task invoked and awaited when a new event is received over the subscription.</param>
 /// <param name="resolveLinkTos">Whether to resolve LinkTo events automatically.</param>
 /// <param name="subscriptionDropped">An action invoked if the subscription is dropped.</param>
 /// <param name="userCredentials">The optional user credentials to perform operation with.</param>
 /// <param name="cancellationToken">The optional <see cref="System.Threading.CancellationToken"/>.</param>
 /// <returns></returns>
 public StreamSubscription SubscribeToStream(string streamName,
                                             StreamRevision start,
                                             Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                             bool resolveLinkTos = false,
                                             Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                             UserCredentials userCredentials     = default,
                                             CancellationToken cancellationToken = default) => SubscribeToStream(streamName, start, eventAppeared,
                                                                                                                 _settings.OperationOptions.Clone(), resolveLinkTos, subscriptionDropped,
                                                                                                                 userCredentials, cancellationToken);
        public static StreamMetadataResult Create(string streamName, StreamRevision revision,
                                                  StreamMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException(nameof(metadata));
            }

            return(new StreamMetadataResult(streamName, revision, metadata));
        }
Example #14
0
 public Task <WriteResult> SetStreamMetadataAsync(string streamName, StreamRevision expectedRevision,
                                                  StreamMetadata metadata, UserCredentials userCredentials = default,
                                                  CancellationToken cancellationToken = default)
 => SetStreamMetadataInternal(metadata, new AppendReq {
     Options = new AppendReq.Types.Options {
         StreamName = SystemStreams.MetastreamOf(streamName),
         Revision   = expectedRevision
     }
 }, userCredentials,
                              cancellationToken);
        public static IEnumerable <object[]> ComparableTestCases()
        {
            var start = new StreamRevision(0);

            yield return(new object[] { start, start, 0 });

            yield return(new object[] { start, StreamRevision.None, -1 });

            yield return(new object[] { StreamRevision.None, start, 1 });
        }
        public Task <IWriteResult> SetStreamMetadataAsync(string streamName, StreamRevision expectedRevision,
                                                          StreamMetadata metadata, Action <EventStoreClientOperationOptions>?configureOperationOptions = null,
                                                          UserCredentials?userCredentials     = null,
                                                          CancellationToken cancellationToken = default)
        {
            var options = Settings.OperationOptions.Clone();

            configureOperationOptions?.Invoke(options);
            return(SetStreamMetadataAsync(streamName, expectedRevision, metadata, options,
                                          userCredentials, cancellationToken));
        }
Example #17
0
 public Task <DeleteResult> SoftDeleteAsync(
     string streamName,
     StreamRevision expectedRevision,
     UserCredentials userCredentials     = default,
     CancellationToken cancellationToken = default) =>
 DeleteInternal(new DeleteReq {
     Options = new DeleteReq.Types.Options {
         StreamName = streamName,
         Revision   = expectedRevision
     }
 }, userCredentials, cancellationToken);
Example #18
0
 private Task <DeleteResult> SoftDeleteAsync(
     string streamName,
     StreamRevision expectedRevision,
     EventStoreClientOperationOptions operationOptions,
     UserCredentials userCredentials     = default,
     CancellationToken cancellationToken = default) =>
 DeleteInternal(new DeleteReq {
     Options = new DeleteReq.Types.Options {
         StreamName = streamName,
         Revision   = expectedRevision
     }
 }, operationOptions, userCredentials, cancellationToken);
 private Task <DeleteResult> TombstoneAsync(
     string streamName,
     StreamRevision expectedRevision,
     EventStoreClientOperationOptions operationOptions,
     UserCredentials?userCredentials     = null,
     CancellationToken cancellationToken = default) =>
 TombstoneInternal(new TombstoneReq {
     Options = new TombstoneReq.Types.Options {
         StreamIdentifier = streamName,
         Revision         = expectedRevision
     }
 }, operationOptions, userCredentials, cancellationToken);
 public Task <WriteResult> AppendToStreamAsync(
     string streamName,
     StreamRevision expectedRevision,
     IEnumerable <EventData> eventData,
     UserCredentials userCredentials     = default,
     CancellationToken cancellationToken = default) =>
 AppendToStreamInternal(new AppendReq {
     Options = new AppendReq.Types.Options {
         StreamName = streamName,
         Revision   = expectedRevision
     }
 }, eventData, userCredentials, cancellationToken);
Example #21
0
        public async Task soft_deleting_a_stream_should_return_log_position()
        {
            var stream = _fixture.GetStreamName();

            var writeResult = await _fixture.Client.AppendToStreamAsync(
                stream,
                StreamState.NoStream,
                _fixture.CreateTestEvents());

            var deleteResult = await _fixture.Client.SoftDeleteAsync(stream, StreamRevision.FromInt64(writeResult.NextExpectedVersion));

            Assert.True(deleteResult.LogPosition > writeResult.LogPosition);
        }
        /// <summary>
        /// Tombstones a stream asynchronously. Note: Tombstoned streams can never be recreated.
        /// </summary>
        /// <param name="streamName">The name of the stream to tombstone.</param>
        /// <param name="expectedRevision">The expected <see cref="StreamRevision"/> of the stream being deleted.</param>
        /// <param name="configureOperationOptions">An <see cref="Action{EventStoreClientOperationOptions}"/> to configure the operation's options.</param>
        /// <param name="userCredentials">The optional <see cref="UserCredentials"/> to perform operation with.</param>
        /// <param name="cancellationToken">The optional <see cref="System.Threading.CancellationToken"/>.</param>
        /// <returns></returns>
        public Task <DeleteResult> TombstoneAsync(
            string streamName,
            StreamRevision expectedRevision,
            Action <EventStoreClientOperationOptions> configureOperationOptions,
            UserCredentials userCredentials     = default,
            CancellationToken cancellationToken = default)
        {
            var operationOptions = _settings.OperationOptions.Clone();

            configureOperationOptions(operationOptions);

            return(TombstoneAsync(streamName, expectedRevision, operationOptions, userCredentials, cancellationToken));
        }
        /// <summary>
        /// Appends events asynchronously to a stream.
        /// </summary>
        /// <param name="streamName">The name of the stream to append events to.</param>
        /// <param name="expectedRevision">The expected <see cref="StreamRevision"/> of the stream to append to.</param>
        /// <param name="eventData">An <see cref="IEnumerable{EventData}"/> to append to the stream.</param>
        /// <param name="configureOperationOptions">An <see cref="Action{EventStoreClientOperationOptions}"/> to configure the operation's options.</param>
        /// <param name="userCredentials">The <see cref="UserCredentials"/> for the operation.</param>
        /// <param name="cancellationToken">The optional <see cref="System.Threading.CancellationToken"/>.</param>
        /// <returns></returns>
        public Task <WriteResult> AppendToStreamAsync(
            string streamName,
            StreamRevision expectedRevision,
            IEnumerable <EventData> eventData,
            Action <EventStoreClientOperationOptions> configureOperationOptions,
            UserCredentials userCredentials     = default,
            CancellationToken cancellationToken = default)
        {
            var options = _settings.OperationOptions.Clone();

            configureOperationOptions(options);

            return(AppendToStreamAsync(streamName, expectedRevision, eventData, options, userCredentials,
                                       cancellationToken));
        }
        public async Task append_with_correct_expected_version_to_existing_stream()
        {
            var stream = _fixture.GetStreamName();

            var writeResult = await _fixture.Client.AppendToStreamAsync(
                stream,
                StreamState.NoStream,
                _fixture.CreateTestEvents(1));

            writeResult = await _fixture.Client.AppendToStreamAsync(
                stream,
                StreamRevision.FromInt64(writeResult.NextExpectedVersion),
                _fixture.CreateTestEvents());

            Assert.Equal(1, writeResult.NextExpectedVersion);
        }
Example #25
0
 public StreamSubscription SubscribeToStream(string streamName,
                                             StreamRevision start,
                                             Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                             bool resolveLinkTos = false,
                                             Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                             UserCredentials userCredentials     = default,
                                             CancellationToken cancellationToken = default) => new StreamSubscription(ReadInternal(new ReadReq {
     Options = new ReadReq.Types.Options {
         ReadDirection = ReadReq.Types.Options.Types.ReadDirection.Forwards,
         ResolveLinks  = resolveLinkTos,
         Stream        = ReadReq.Types.Options.Types.StreamOptions.FromStreamNameAndRevision(streamName, start),
         Subscription  = new ReadReq.Types.Options.Types.SubscriptionOptions()
     }
 },
                                                                                                                                   userCredentials,
                                                                                                                                   cancellationToken), eventAppeared, subscriptionDropped);
Example #26
0
        in_case_where_multiple_writes_of_multiple_events_with_the_same_ids_using_expected_version_nostream_then_next_expected_version_is_correct()
        {
            var stream = _fixture.GetStreamName();

            var evnt           = _fixture.CreateTestEvents().First();
            var events         = new[] { evnt, evnt, evnt, evnt, evnt, evnt };
            var streamRevision = StreamRevision.FromInt64(events.Length - 1);

            var writeResult = await _fixture.Client.AppendToStreamAsync(stream, StreamState.NoStream, events);

            Assert.Equal(streamRevision, writeResult.NextExpectedStreamRevision);

            writeResult = await _fixture.Client.AppendToStreamAsync(stream, StreamState.NoStream, events);

            Assert.Equal(streamRevision, writeResult.NextExpectedStreamRevision);
        }
        /// <summary>
        /// Subscribes to a stream from a checkpoint. This is exclusive of.
        /// </summary>
        /// <param name="start">A <see cref="Position"/> (exclusive of) to start the subscription from.</param>
        /// <param name="streamName">The name of the stream to read events from.</param>
        /// <param name="eventAppeared">A Task invoked and awaited when a new event is received over the subscription.</param>
        /// <param name="configureOperationOptions">An <see cref="Action{EventStoreClientOperationOptions}"/> to configure the operation's options.</param>
        /// <param name="resolveLinkTos">Whether to resolve LinkTo events automatically.</param>
        /// <param name="subscriptionDropped">An action invoked if the subscription is dropped.</param>
        /// <param name="userCredentials">The optional user credentials to perform operation with.</param>
        /// <param name="cancellationToken">The optional <see cref="System.Threading.CancellationToken"/>.</param>
        /// <returns></returns>
        public Task <StreamSubscription> SubscribeToStreamAsync(string streamName,
                                                                StreamRevision start,
                                                                Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                                                bool resolveLinkTos = false,
                                                                Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                                                Action <EventStoreClientOperationOptions> configureOperationOptions = default,
                                                                UserCredentials userCredentials     = default,
                                                                CancellationToken cancellationToken = default)
        {
            var operationOptions = _settings.OperationOptions.Clone();

            configureOperationOptions?.Invoke(operationOptions);

            return(SubscribeToStreamAsync(streamName, start, eventAppeared, operationOptions, resolveLinkTos,
                                          subscriptionDropped, userCredentials, cancellationToken));
        }
        public async Task reading_throws()
        {
            var stream = _fixture.GetStreamName();

            var writeResult = await _fixture.Client.AppendToStreamAsync(
                stream,
                StreamState.NoStream,
                _fixture.CreateTestEvents());

            Assert.Equal(0, writeResult.NextExpectedVersion);

            await _fixture.Client.SoftDeleteAsync(stream, StreamRevision.FromInt64(writeResult.NextExpectedVersion));

            await Assert.ThrowsAsync <StreamNotFoundException>(
                () => _fixture.Client.ReadStreamAsync(Direction.Forwards, stream, StreamPosition.Start)
                .ToArrayAsync().AsTask());
        }
        private Task <IWriteResult> AppendToStreamAsync(
            string streamName,
            StreamRevision expectedRevision,
            IEnumerable <EventData> eventData,
            EventStoreClientOperationOptions operationOptions,
            UserCredentials?userCredentials     = null,
            CancellationToken cancellationToken = default)
        {
            _log.LogDebug("Append to stream - {streamName}@{expectedRevision}.", streamName, expectedRevision);

            return(AppendToStreamInternal(new AppendReq {
                Options = new AppendReq.Types.Options {
                    StreamIdentifier = streamName,
                    Revision = expectedRevision
                }
            }, eventData, operationOptions, userCredentials, cancellationToken));
        }
Example #30
0
 public EventRecord(
     string eventStreamId,
     Uuid eventId,
     StreamRevision eventNumber,
     Position position,
     IDictionary <string, string> metadata,
     byte[] data,
     byte[] customMetadata)
 {
     EventStreamId = eventStreamId;
     EventId       = eventId;
     EventNumber   = eventNumber;
     Position      = position;
     Data          = data;
     Metadata      = customMetadata;
     EventType     = metadata[Constants.Metadata.Type];
     Created       = Convert.ToInt64(metadata[Constants.Metadata.Created]).FromTicksSinceEpoch();
     IsJson        = bool.Parse(metadata[Constants.Metadata.IsJson]);
 }