@johngw/stream
Version:
Reactive programming tools using the WHATWG Streams API.
53 lines • 1.34 kB
JavaScript
/**
* Turns a `ReadableStream` in to an `AsyncIterator`.
*
* @group Sinks
* @see {@link toIterable:function}
* @example
* ```
* const iterator = toIterator(stream)
* while (true) {
* const result = await iterator.next()
* if (result.done) break
* doSomething(result.value)
* }
* ```
*/
export function toIterator(stream, options) {
return new StreamIterator(stream, options?.signal);
}
class StreamIterator {
#reader;
#signal;
constructor(stream, signal) {
this.#reader = stream.getReader();
this.#signal = signal;
if (signal?.aborted)
this.throw(signal.reason);
signal?.addEventListener('abort', () => this.throw(signal.reason));
}
next() {
return this.#signal?.aborted
? Promise.reject(this.#signal.reason)
: this.#reader.read();
}
async return(value) {
try {
await this.#reader.cancel();
}
catch (error) {
// potentially already closed
}
return { done: true, value };
}
async throw(reason) {
try {
await this.#reader.cancel(reason);
}
catch (error) {
// potentially already closed
}
return { done: true, value: undefined };
}
}
//# sourceMappingURL=toIterator.js.map