@sec-ant/readable-stream v0.6.0
@sec-ant/readable-stream
A tiny, zero-dependency yet spec-compliant asynchronous iterator polyfill/ponyfill for ReadableStreams.
Features
Asynchronously iterate a ReadableStream
With this package, you can consume a ReadableStream as an AsyncIterable.
- spec: https://streams.spec.whatwg.org/#rs-asynciterator
- tests: https://github.com/Sec-ant/readable-stream/blob/main/tests/asyncIterator.spec.ts (copied from wpt)
Convert an AsyncIterable or an Iterable into a ReadableStream
With this package, you can construct a ReadableStream from an AsyncIterable or an Iterable.
- spec: https://streams.spec.whatwg.org/#rs-from
- tests: https://github.com/Sec-ant/readable-stream/blob/main/tests/fromAnyIterable.spec.ts (copied from wpt)
This package passes all the aforementioned tests.
Install
npm i @sec-ant/readable-streamUsage
Ponyfill
This package can be imported as a ponyfill to avoid side effects:
asyncIterator
Path:
@sec-ant/readable-stream/ponyfill/asyncIteratorExample:
import {
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/ponyfill/asyncIterator";
const readableStream = (await fetch("https://www.example.org/")).body;
let total = 0;
for await (const chunk of asyncIterator(readableStream)) {
total += chunk.length;
}
console.log(total);Check https://streams.spec.whatwg.org/#rs-class-definition and https://streams.spec.whatwg.org/#rs-asynciterator for further explanation on ReadableStreamIteratorOptions.
fromAnyIterable
Path:
@sec-ant/readable-stream/ponyfill/fromAnyIterableExample:
import { fromAnyIterable } from "@sec-ant/readable-stream/ponyfill/fromAnyIterable";
const readableStream = fromAnyIterable(["a", "b"]);All-in-One
Path:
@sec-ant/readable-stream/ponyfillExample:
import {
fromAnyIterable,
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/ponyfill";Polyfill
This package can be imported as a drop-in polyfill with side effects.
ReadableStream.prototype[Symbol.asyncIterator] and ReadableStream.prototype.values
Path:
@sec-ant/readable-stream/polyfill/asyncIteratorExample:
import "@sec-ant/readable-stream/polyfill/asyncIterator";
const readableStream = (await fetch("https://www.example.org/")).body;
let total = 0;
for await (const chunk of readableStream) {
total += chunk.length;
}
console.log(total);ReadableStream.from
Path:
@sec-ant/readable-stream/polyfill/fromAnyIterableExample:
import "@sec-ant/readable-stream/polyfill/fromAnyIterable";
const readableStream = ReadableStream.from(["a", "b"]);Note that ReadableStream.from is not typed because declared vars cannot be overridden.
All-in-One
Path:
@sec-ant/readable-stream/polyfillExample:
import "@sec-ant/readable-stream/polyfill";Ponyfill + Polyfill
asyncIterator
Path:
@sec-ant/readable-stream/asyncIteratorExample:
import {
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/asyncIterator";
// also with side effectsfromAnyIterable
Path:
@sec-ant/readable-stream/fromAnyIterableExample:
import { fromAnyIterable } from "@sec-ant/readable-stream/fromAnyIterable";
// also with side effectsAll-in-One
Path:
@sec-ant/readable-streamExample:
import {
fromAnyIterable,
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream";
// also with side effectsTypes
You can also use this package to augment the ReadableStream type for async iteration if the runtime already supports it but the type system does not.
Path:
@sec-ant/readable-stream/async-iteratorExample:
/// <reference types="@sec-ant/readable-stream/async-iterator" />License
MIT