using System;
using System.Threading.Tasks;
using EventStore.ClientAPI.ClientOperations;
using EventStore.ClientAPI.Internal;
using EventStore.ClientAPI.SystemData;
namespace EventStore.ClientAPI
{
internal struct PersistentSubscriptionResolvedEvent : IResolvedEvent
{
///
///
///
public readonly int? RetryCount;
///
///
///
public readonly ResolvedEvent Event;
///
///
///
///
///
internal PersistentSubscriptionResolvedEvent(ResolvedEvent @event, int? retryCount)
{
Event = @event;
RetryCount = retryCount;
}
string IResolvedEvent.OriginalStreamId => Event.OriginalStreamId;
long IResolvedEvent.OriginalEventNumber => Event.OriginalEventNumber;
RecordedEvent IResolvedEvent.OriginalEvent => Event.OriginalEvent;
Position? IResolvedEvent.OriginalPosition => Event.OriginalPosition;
///
///
///
///
///
public static implicit operator ResolvedEvent(PersistentSubscriptionResolvedEvent x) => x.Event;
}
///
/// Represents a persistent subscription connection.
///
public class EventStorePersistentSubscription : EventStorePersistentSubscriptionBase
{
private readonly EventStoreConnectionLogicHandler _handler;
internal EventStorePersistentSubscription(
string subscriptionId, string streamId,
Func eventAppeared,
Action subscriptionDropped,
UserCredentials userCredentials, ILogger log, bool verboseLogging, ConnectionSettings settings,
EventStoreConnectionLogicHandler handler, int bufferSize = 10, bool autoAck = true)
: base(
subscriptionId, streamId, eventAppeared, subscriptionDropped, userCredentials, log, verboseLogging,
settings, bufferSize, autoAck)
{
_handler = handler;
}
internal override Task StartSubscription(
string subscriptionId, string streamId, int bufferSize, UserCredentials userCredentials,
Func onEventAppeared,
Action onSubscriptionDropped, ConnectionSettings settings)
{
var source = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
_handler.EnqueueMessage(new StartPersistentSubscriptionMessage(source, subscriptionId, streamId, bufferSize,
userCredentials, onEventAppeared,
onSubscriptionDropped, settings.MaxRetries, settings.OperationTimeout));
return source.Task;
}
}
}