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));
        }
        private Task <StreamSubscription> SubscribeToAllAsync(Position start,
                                                              Func <StreamSubscription, ResolvedEvent, CancellationToken, Task> eventAppeared,
                                                              EventStoreClientOperationOptions operationOptions,
                                                              bool resolveLinkTos = false,
                                                              Action <StreamSubscription, SubscriptionDroppedReason, Exception> subscriptionDropped = default,
                                                              SubscriptionFilterOptions filterOptions = null,
                                                              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,
                    All = ReadReq.Types.Options.Types.AllOptions.FromPosition(start),
                    Subscription = new ReadReq.Types.Options.Types.SubscriptionOptions(),
                    Filter = GetFilterOptions(filterOptions)
                }
            }, operationOptions, userCredentials, cancellationToken), eventAppeared, subscriptionDropped, _log,
                                              filterOptions?.CheckpointReached, cancellationToken));
        }