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