stream_slicing
This is a Deno library containing utilities for working with web standard streams (ReadableStream). This library is useful for incrementally reading data from streams.
Examples
import { PartialReader } from "https://deno.land/x/stream_slicing@v0.1.0/partial_reader.ts";
const response = fetch("...");
const stream = response.body!;
const partialReader = PartialReader.fromStream(stream);
const header = await partialReader.readAmountStrict(30);
// `header` will be a 30 byte long Uint8Array
const nextMegabyteStream = partialReader.streamAmount(1024 * 1024).stream;
// `nextMegabyteStream` will be a ReadableStream of the next
// megabyte of data read from `stream`.The Deno library streaming_zip’s read.ts shows some real-world examples of this library being used for parsing zip file data from a stream.
API
PartialReader
The PartialReader class is exported from partial_reader.ts, and you
instantiate it by calling PartialReader.fromStream(stream: ReadableStream).
The class contains the following methods:
- limitedRead(maxSize: number) Like calling read() on a reader of the
stream, but returns no more than
maxSizebytes at a time. - readAmount(size: number) Reads and returns
sizebytes from the stream, or fewer if the stream ends while reading. - readAmountStrict(size: number) Reads and returns
sizebytes from the stream. Throws an error if the stream ends while reading. - streamAmount(size: number) Returns an object with a
streamproperty containing a ReadableStream that forwards the nextsizebytes from the PartialReader’s stream.
There is no streamAmountStrict(size: number) method that returns a stream that
errors if PartialReader’s stream ends early. You must use streamAmount() and
ExactBytesTransformStream together if you want to accomplish this:
import { ExactBytesTransformStream } from "https://deno.land/x/stream_slicing@v0.1.0/exact_bytes_transform_stream.ts";
import { PartialReader } from "https://deno.land/x/stream_slicing@v0.1.0/partial_reader.ts";
const response = fetch("...");
const stream = response.body!;
const partialReader = PartialReader.fromStream(stream);
const nextMegabyteStream = partialReader
.streamAmount(1024 * 1024).stream
.pipeThrough(new ExactBytesTransformStream(1024 * 1024));ExactBytesTransformStream
The ExactBytesTransformStream class is exported from
exact_bytes_transform_stream.ts, and you instantiate it by calling
new ExactBytesTransformStream(size: number). The class is a TransformStream
that will emit an error if a number of bytes unequal to size are piped through
it.