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