import { readableStreamFromIterable } from "https://deno.land/x/proc@0.20.10/src/deps/streams.ts";
Create a ReadableStream
from any kind of iterable.
import { readableStreamFromIterable } from "https://deno.land/std@0.224.0/streams/readable_stream_from_iterable.ts";
const r1 = readableStreamFromIterable(["foo, bar, baz"]);
const r2 = readableStreamFromIterable(async function* () {
await new Promise(((r) => setTimeout(r, 1000)));
yield "foo";
await new Promise(((r) => setTimeout(r, 1000)));
yield "bar";
await new Promise(((r) => setTimeout(r, 1000)));
yield "baz";
}());
If the produced iterator (iterable[Symbol.asyncIterator]()
or
iterable[Symbol.iterator]()
) is a generator, or more specifically is found
to have a .throw()
method on it, that will be called upon
readableStream.cancel()
. This is the case for the second input type above:
import { readableStreamFromIterable } from "https://deno.land/std@0.224.0/streams/readable_stream_from_iterable.ts";
const r3 = readableStreamFromIterable(async function* () {
try {
yield "foo";
} catch (error) {
console.log(error); // Error: Cancelled by consumer.
}
}());
const reader = r3.getReader();
console.log(await reader.read()); // { value: "foo", done: false }
await reader.cancel(new Error("Cancelled by consumer."));