UNPKG

@johngw/stream

Version:

Reactive programming tools using the WHATWG Streams API.

53 lines 1.34 kB
/** * 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