Use chunked reader from package:async
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d5a2f0..6aa953f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.3
+
+- Drop `chunked_stream` dependency in favor of `package:async`.
+
 ## 0.3.2
 
 - Allow arbitrarily many zero bytes at the end of an archive when
diff --git a/lib/src/reader.dart b/lib/src/reader.dart
index eff4135..de84d6a 100644
--- a/lib/src/reader.dart
+++ b/lib/src/reader.dart
@@ -3,7 +3,7 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
-import 'package:chunked_stream/chunked_stream.dart';
+import 'package:async/async.dart';
 import 'package:meta/meta.dart';
 import 'package:typed_data/typed_data.dart';
 
@@ -23,7 +23,7 @@
 @sealed
 class TarReader implements StreamIterator<TarEntry> {
   /// A chunked stream iterator to enable us to get our data.
-  final ChunkedStreamIterator<int> _chunkedStream;
+  final ChunkedStreamReader<int> _chunkedStream;
   final PaxHeaders _paxHeaders = PaxHeaders();
   final int _maxSpecialFileSize;
 
@@ -88,7 +88,7 @@
   TarReader(Stream<List<int>> tarStream,
       {int maxSpecialFileSize = defaultSpecialLength,
       bool disallowTrailingData = false})
-      : _chunkedStream = ChunkedStreamIterator(tarStream),
+      : _chunkedStream = ChunkedStreamReader(tarStream),
         _checkNoTrailingData = disallowTrailingData,
         _maxSpecialFileSize = maxSpecialFileSize;
 
@@ -315,6 +315,7 @@
     if (_checkNoTrailingData) {
       // Trailing zeroes are okay, but don't allow any more data here.
       Uint8List block;
+
       do {
         block = await _chunkedStream.readBytes(blockSize);
         if (!block.isAllZeroes) {
@@ -394,7 +395,7 @@
 
       final streamLength = nextBlockSize(sparseDataLength);
       final safeStream =
-          _publishStream(_chunkedStream.substream(streamLength), streamLength);
+          _publishStream(_chunkedStream.readStream(streamLength), streamLength);
       return sparseStream(safeStream, sparseHoles, header.size);
     } else {
       var size = header.size;
@@ -409,7 +410,7 @@
       } else {
         _markPaddingToSkip(size);
         return _publishStream(
-            _chunkedStream.substream(header.size), header.size);
+            _chunkedStream.readStream(header.size), header.size);
       }
     }
   }
@@ -860,7 +861,7 @@
 
 /// Event-sink tracking the length of emitted tar entry streams.
 ///
-/// [ChunkedStreamIterator.substream] might return a stream shorter than
+/// [ChunkedStreamReader.readStream] might return a stream shorter than
 /// expected. That indicates an invalid tar file though, since the correct size
 /// is stored in the header.
 class _OutgoingStreamGuard extends EventSink<List<int>> {
diff --git a/lib/src/sparse.dart b/lib/src/sparse.dart
index dc59444..06b88b1 100644
--- a/lib/src/sparse.dart
+++ b/lib/src/sparse.dart
@@ -1,4 +1,4 @@
-import 'package:chunked_stream/chunked_stream.dart';
+import 'package:async/async.dart';
 import 'package:meta/meta.dart';
 
 import 'exception.dart';
@@ -37,7 +37,7 @@
 Stream<List<int>> sparseStream(
     Stream<List<int>> source, List<SparseEntry> sparseHoles, int size) {
   if (sparseHoles.isEmpty) {
-    return ChunkedStreamIterator(source).substream(size);
+    return ChunkedStreamReader(source).readStream(size);
   }
 
   return _sparseStream(source, sparseHoles, size);
@@ -56,7 +56,7 @@
   var sparseHoleIndex = 0;
 
   // Iterator through [source] to obtain the data bytes.
-  final iterator = ChunkedStreamIterator(source);
+  final iterator = ChunkedStreamReader(source);
 
   while (position < size) {
     // Yield all the necessary sparse holes.
@@ -79,7 +79,7 @@
 
     // Yield data as substream, but make sure that we have enough data.
     var checkedPosition = position;
-    await for (final chunk in iterator.substream(yieldTo - position)) {
+    await for (final chunk in iterator.readStream(yieldTo - position)) {
       yield chunk;
       checkedPosition += chunk.length;
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index 56ef9db..71c6f2a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,13 +1,13 @@
 name: tar
 description: Memory-efficient, streaming implementation of the tar file format
-version: 0.3.2
+version: 0.3.3
 repository: https://github.com/simolus3/tar/
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
-  chunked_stream: ^1.4.0
+  async: ^2.6.0
   meta: ^1.3.0
   typed_data: ^1.3.0
 
diff --git a/test/reader_test.dart b/test/reader_test.dart
index 04a0572..a8944a0 100644
--- a/test/reader_test.dart
+++ b/test/reader_test.dart
@@ -3,7 +3,7 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-import 'package:chunked_stream/chunked_stream.dart';
+import 'package:async/async.dart';
 import 'package:tar/src/reader.dart';
 import 'package:tar/src/utils.dart';
 import 'package:test/test.dart';
@@ -95,12 +95,11 @@
     test('if the stream emits an error in content', () async {
       // Craft a stream that starts with a valid tar file, but then emits an
       // error in the middle of an entry. First 512 bytes are headers.
-      final iterator =
-          ChunkedStreamIterator(File('reference/v7.tar').openRead());
+      final iterator = ChunkedStreamReader(File('reference/v7.tar').openRead());
       final controller = StreamController<List<int>>();
       controller.onListen = () async {
         // headers + 3 bytes of content
-        await controller.addStream(iterator.substream(515));
+        await controller.addStream(iterator.readStream(515));
         controller.addError('foo');
       };
 
diff --git a/test/sparse_test.dart b/test/sparse_test.dart
index a819abd..6e3c695 100644
--- a/test/sparse_test.dart
+++ b/test/sparse_test.dart
@@ -3,7 +3,7 @@
 import 'dart:math';
 import 'dart:typed_data';
 
-import 'package:chunked_stream/chunked_stream.dart';
+import 'package:async/async.dart';
 import 'package:tar/src/sparse.dart';
 import 'package:tar/tar.dart';
 import 'package:test/test.dart';
@@ -77,12 +77,12 @@
       fail('Unexpected file $fileName in tar file');
     }
 
-    final actualContents = ChunkedStreamIterator(File(matchingFile).openRead());
-    final tarContents = ChunkedStreamIterator(reader.current.contents);
+    final actualContents = ChunkedStreamReader(File(matchingFile).openRead());
+    final tarContents = ChunkedStreamReader(reader.current.contents);
 
     while (true) {
-      final actualChunk = await actualContents.read(1024);
-      final tarChunk = await tarContents.read(1024);
+      final actualChunk = await actualContents.readBytes(1024);
+      final tarChunk = await tarContents.readBytes(1024);
       expect(tarChunk, actualChunk);
 
       if (actualChunk.isEmpty) break;