private async Task <(long Chunks, long Bytes)> StreamContentWithCompressionAsync(Stream reader, byte[] buffer, IServerStreamWriter <CopyFileResponse> responseStream, CancellationToken ct = default(CancellationToken)) { Debug.Assert(!(reader is null)); Debug.Assert(!(responseStream is null)); long bytes = 0L; long chunks = 0L; using (Stream grpcStream = new BufferedWriteStream( buffer, async(byte[] bf, int offset, int count) => { ByteString content = ByteString.CopyFrom(bf, offset, count); CopyFileResponse response = new CopyFileResponse() { Content = content, Index = chunks }; await responseStream.WriteAsync(response); bytes += count; chunks++; } )) { using (Stream compressionStream = new GZipStream(grpcStream, System.IO.Compression.CompressionLevel.Fastest, true)) { await reader.CopyToAsync(compressionStream, buffer.Length, ct).ConfigureAwait(false); await compressionStream.FlushAsync().ConfigureAwait(false); } await grpcStream.FlushAsync().ConfigureAwait(false); } return(chunks, bytes); }
private async Task <Result <(long Chunks, long Bytes)> > StreamContentWithCompressionAsync(Stream input, byte[] buffer, byte[] secondaryBuffer, IServerStreamWriter <CopyFileResponse> responseStream, CancellationToken ct) { long bytes = 0L; long chunks = 0L; using (Stream grpcStream = new BufferedWriteStream( buffer, async(byte[] bf, int offset, int count) => { ByteString content = ByteString.CopyFrom(bf, offset, count); CopyFileResponse response = new CopyFileResponse() { Content = content, Index = chunks }; await responseStream.WriteAsync(response); bytes += count; chunks++; } )) { using (Stream compressionStream = new GZipStream(grpcStream, System.IO.Compression.CompressionLevel.Fastest, true)) { await input.CopyToAsync(compressionStream, buffer.Length, ct); await compressionStream.FlushAsync(ct); } await grpcStream.FlushAsync(ct); } return(chunks, bytes); }