zipReadableStreams

import { zipReadableStreams } from "jsr:@ende/streams";

function

function zipReadableStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T>

Merge multiple streams into a single one, taking order into account, and each stream will wait for a chunk to enqueue before the next stream can append another chunk.

If a stream ends before other ones, the others will continue adding data in order, and the finished one will not add any more data. If you want to cancel the other streams when one of them ends, use earlyZipReadableStreams.

...streams: ReadableStream<T>[]

An iterable of ReadableStreams to merge.

Returns

A ReadableStream that will emit the zipped chunks.

Example: Zip 2 streams with the same length

import { zipReadableStreams } from "@ende/streams/zip-readable-streams";
import { assertEquals } from "@ende/assert";

const stream1 = ReadableStream.from(["1", "2", "3"]);
const stream2 = ReadableStream.from(["a", "b", "c"]);
const zippedStream = zipReadableStreams(stream1, stream2);

assertEquals(
  await Array.fromAsync(zippedStream),
  ["1", "a", "2", "b", "3", "c"],
);

Example: Zip 2 streams with different length (first one is shorter)

import { zipReadableStreams } from "@ende/streams/zip-readable-streams";
import { assertEquals } from "@ende/assert";

const stream1 = ReadableStream.from(["1", "2"]);
const stream2 = ReadableStream.from(["a", "b", "c", "d"]);
const zippedStream = zipReadableStreams(stream1, stream2);

assertEquals(
  await Array.fromAsync(zippedStream),
  ["1", "a", "2", "b", "c", "d"],
);

Example: Zip 2 streams with different length (first one is longer)

import { zipReadableStreams } from "@ende/streams/zip-readable-streams";
import { assertEquals } from "@ende/assert";

const stream1 = ReadableStream.from(["1", "2", "3", "4"]);
const stream2 = ReadableStream.from(["a", "b"]);
const zippedStream = zipReadableStreams(stream1, stream2);

assertEquals(
  await Array.fromAsync(zippedStream),
  ["1", "a", "2", "b", "3", "4"],
);

Example: Zip 3 streams

import { zipReadableStreams } from "@ende/streams/zip-readable-streams";
import { assertEquals } from "@ende/assert";

const stream1 = ReadableStream.from(["1"]);
const stream2 = ReadableStream.from(["a", "b"]);
const stream3 = ReadableStream.from(["A", "B", "C"]);
const zippedStream = zipReadableStreams(stream1, stream2, stream3);

assertEquals(
  await Array.fromAsync(zippedStream),
  ["1", "a", "A", "b", "B", "C"],
);

Source