@sec-ant/readable-stream
v0.6.0
Published
A tiny, zero-dependency yet spec-compliant asynchronous iterator polyfill/ponyfill for ReadableStreams.
Downloads
8,642,152
Maintainers
Readme
@sec-ant/readable-stream
A tiny, zero-dependency yet spec-compliant asynchronous iterator polyfill/ponyfill for ReadableStream
s.
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-stream
Usage
Ponyfill
This package can be imported as a ponyfill to avoid side effects:
asyncIterator
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
.
fromAnyIterable
Path:
@sec-ant/readable-stream/ponyfill/fromAnyIterable
Example:
import { fromAnyIterable } from "@sec-ant/readable-stream/ponyfill/fromAnyIterable";
const readableStream = fromAnyIterable(["a", "b"]);
All-in-One
Path:
@sec-ant/readable-stream/ponyfill
Example:
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/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);
ReadableStream.from
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.
All-in-One
Path:
@sec-ant/readable-stream/polyfill
Example:
import "@sec-ant/readable-stream/polyfill";
Ponyfill + Polyfill
asyncIterator
Path:
@sec-ant/readable-stream/asyncIterator
Example:
import {
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream/asyncIterator";
// also with side effects
fromAnyIterable
Path:
@sec-ant/readable-stream/fromAnyIterable
Example:
import { fromAnyIterable } from "@sec-ant/readable-stream/fromAnyIterable";
// also with side effects
All-in-One
Path:
@sec-ant/readable-stream
Example:
import {
fromAnyIterable,
asyncIterator,
type ReadableStreamIteratorOptions,
} from "@sec-ant/readable-stream";
// also with side effects
Types
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" />
License
MIT