private async IAsyncEnumerable EnumerateResponsesAsync( Func requestBuilder, [EnumeratorCancellation] CancellationToken cancellationToken) { string? continuationToken = null; do { var request = requestBuilder(); request.ContinuationToken = continuationToken; request.BucketName = _settings.S3.Bucket; var response = await s3.ListObjectsV2Async(request, cancellationToken); yield return response; continuationToken = response.IsTruncated == true ? response.NextContinuationToken : null; } while (continuationToken is not null); } private async IAsyncEnumerable EnumerateObjectsAsync( Func requestBuilder, [EnumeratorCancellation] CancellationToken cancellationToken) { await foreach (var response in EnumerateResponsesAsync(requestBuilder, cancellationToken)) { foreach (var obj in response.S3Objects ?? []) yield return obj; } }