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; } } }