public async Task TestPipeDecompress() { var ms = new MemoryStream(_compressedData, false); var reader = PipeReader.Create(ms); var fse = new FsePipeDecompressor(_writer); while (true) { ReadResult readResult = await reader.ReadAsync().ConfigureAwait(false); if (readResult.IsCompleted || readResult.IsCanceled) { return; } fse.Process(readResult.Buffer, out SequencePosition consumed, out SequencePosition examined); reader.AdvanceTo(consumed, examined); switch (fse.State) { case FseDecompressorState.WriteOutput: fse.NotifyFlushCompleted(); break; case FseDecompressorState.InvalidData: throw new InvalidDataException(); case FseDecompressorState.InvalidChecksum: throw new InvalidDataException(); case FseDecompressorState.Completed: return; } } }
public static async Task DecompressAsync(PipeReader reader, PipeWriter writer, CancellationToken cancellationToken = default) { var fse = new FsePipeDecompressor(writer); while (true) { ReadResult readResult = await reader.ReadAsync(cancellationToken).ConfigureAwait(false); if (readResult.IsCompleted || readResult.IsCanceled) { await writer.CompleteAsync().ConfigureAwait(false); return; } fse.Process(readResult.Buffer, out SequencePosition consumed, out SequencePosition examined); reader.AdvanceTo(consumed, examined); switch (fse.State) { case FseDecompressorState.WriteOutput: await writer.FlushAsync().ConfigureAwait(false); fse.NotifyFlushCompleted(); break; case FseDecompressorState.InvalidData: throw new InvalidDataException(); case FseDecompressorState.InvalidChecksum: throw new InvalidDataException(); case FseDecompressorState.Completed: await writer.CompleteAsync().ConfigureAwait(false); return; } } }