Beispiel #1
0
        /// <inheritdoc />
        public async IAsyncEnumerable <ChangesFeedResponseResult <TSource> > GetContinuousChangesAsync(ChangesFeedOptions options, ChangesFeedFilter filter,
                                                                                                       [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var           infiniteTimeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
            IFlurlRequest request         = NewRequest()
                                            .WithTimeout(infiniteTimeout)
                                            .AppendPathSegment("_changes")
                                            .SetQueryParam("feed", "continuous");

            if (options != null)
            {
                request = request.ApplyQueryParametersOptions(options);
            }

            await using Stream stream = filter == null
                ? await request.GetStreamAsync(cancellationToken, HttpCompletionOption.ResponseHeadersRead)
                                        .ConfigureAwait(false)
                : await request.QueryContinuousWithFilterAsync <TSource>(_queryProvider, filter, cancellationToken)
                                        .ConfigureAwait(false);

            await foreach (var line in stream.ReadLinesAsync(cancellationToken))
            {
                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }

                ChangesFeedResponseResult <TSource> result = JsonConvert.DeserializeObject <ChangesFeedResponseResult <TSource> >(line);
                yield return(result);
            }
        }
        /// <inheritdoc />
        public async Task <IList <CouchDocumentInfo> > GetAsync(LocalDocumentsOptions?options       = null,
                                                                CancellationToken cancellationToken = default)
        {
            IFlurlRequest request = NewRequest();

            if (options != null)
            {
                request = request.ApplyQueryParametersOptions(options);
            }

            LocalDocumentsResult result = await request
                                          .AppendPathSegments("_local_docs")
                                          .GetJsonAsync <LocalDocumentsResult>(cancellationToken)
                                          .SendRequestAsync()
                                          .ConfigureAwait(false);

            return(result.Rows);
        }
        /// <inheritdoc />
        public async Task <IList <CouchDocumentInfo> > GetAsync(IReadOnlyCollection <string> keys,
                                                                LocalDocumentsOptions?options = null, CancellationToken cancellationToken = default)
        {
            IFlurlRequest request = NewRequest();

            if (options != null)
            {
                request = request.ApplyQueryParametersOptions(options);
            }

            LocalDocumentsResult result = await request
                                          .AppendPathSegments("_local_docs")
                                          .PostJsonAsync(new { keys }, cancellationToken)
                                          .SendRequestAsync()
                                          .ReceiveJson <LocalDocumentsResult>()
                                          .ConfigureAwait(false);

            return(result.Rows);
        }
Beispiel #4
0
        /// <inheritdoc />
        public async Task <ChangesFeedResponse <TSource> > GetChangesAsync(ChangesFeedOptions?options = null, ChangesFeedFilter?filter = null, CancellationToken cancellationToken = default)
        {
            IFlurlRequest request = NewRequest()
                                    .AppendPathSegment("_changes");

            if (options?.LongPoll == true)
            {
                _ = request.SetQueryParam("feed", "longpoll");
            }

            if (options != null)
            {
                request = request.ApplyQueryParametersOptions(options);
            }

            return(filter == null
                ? await request.GetJsonAsync <ChangesFeedResponse <TSource> >(cancellationToken)
                   .ConfigureAwait(false)
                : await request.QueryWithFilterAsync <TSource>(_queryProvider, filter, cancellationToken)
                   .ConfigureAwait(false));
        }
Beispiel #5
0
        /// <inheritdoc />
        public async IAsyncEnumerable <ChangesFeedResponseResult <TSource> > GetContinuousChangesAsync(ChangesFeedOptions?options, ChangesFeedFilter?filter,
                                                                                                       [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var           infiniteTimeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
            IFlurlRequest request         = NewRequest()
                                            .WithTimeout(infiniteTimeout)
                                            .AppendPathSegment("_changes")
                                            .SetQueryParam("feed", "continuous");

            if (options != null)
            {
                request = request.ApplyQueryParametersOptions(options);
            }

            await using Stream stream = filter == null
                ? await request.GetStreamAsync(cancellationToken, HttpCompletionOption.ResponseHeadersRead)
                                        .ConfigureAwait(false)
                : await request.QueryContinuousWithFilterAsync <TSource>(_queryProvider, filter, cancellationToken)
                                        .ConfigureAwait(false);

            await foreach (var line in stream.ReadLinesAsync(cancellationToken))
            {
                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }

                MatchCollection matches = _feedChangeLineStartPattern.Matches(line);
                for (var i = 0; i < matches.Count; i++)
                {
                    var startIndex = matches[i].Index;
                    var endIndex   = i < matches.Count - 1 ? matches[i + 1].Index : line.Length;
                    var lineLength = endIndex - startIndex;
                    var substring  = line.Substring(startIndex, lineLength);
                    yield return(JsonConvert.DeserializeObject <ChangesFeedResponseResult <TSource> >(substring));
                }
            }
        }