A tiny, zero-dependency yet spec-compliant asynchronous iterator polyfill/ponyfill for ReadableStream
s.
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)
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.
npm i @sec-ant/readable-stream
This package can be imported as a ponyfill to avoid side effects:
Path:
@sec-ant/readable-stream/ponyfill/asyncIterator
Example:
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
.
Path:
@sec-ant/readable-stream/ponyfill/fromAnyIterable
Example:
import { fromAnyIterable } from "@sec-ant/readable-stream/ponyfill/fromAnyIterable";
const readableStream = fromAnyIterable(["a", "b"]);
Path:
@sec-ant/readable-stream/ponyfill
Example:
import {
fromAnyIterable,
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/ponyfill";
This package can be imported as a drop-in polyfill with side effects.
Path:
@sec-ant/readable-stream/polyfill/asyncIterator
Example:
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);
Path:
@sec-ant/readable-stream/polyfill/fromAnyIterable
Example:
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.
Path:
@sec-ant/readable-stream/polyfill
Example:
import "@sec-ant/readable-stream/polyfill";
Path:
@sec-ant/readable-stream/asyncIterator
Example:
import {
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/asyncIterator";
// also with side effects
Path:
@sec-ant/readable-stream/fromAnyIterable
Example:
import { fromAnyIterable } from "@sec-ant/readable-stream/fromAnyIterable";
// also with side effects
Path:
@sec-ant/readable-stream
Example:
import {
fromAnyIterable,
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream";
// also with side effects
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-iterator
Example:
/// <reference types="@sec-ant/readable-stream/async-iterator" />
MIT