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);
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);
/// <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)); }
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)); }
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);
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);
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); }
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);
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)); }
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]); }