diff --git a/packages/node/tests/_helpers/chunks.ts b/packages/node/tests/_helpers/chunks.ts index b00d12a3..b6bce14a 100644 --- a/packages/node/tests/_helpers/chunks.ts +++ b/packages/node/tests/_helpers/chunks.ts @@ -1,6 +1,22 @@ import { Readable } from 'stream'; import { ChunkSplitter } from '../../src/streams/chunkifier.js'; +/** + * Trims array from right until `predicate` returns `false`. + * @returns Trimmed array. + */ +function trimRightIf(t: T[], predicate: (t: T) => boolean) { + for (let i = t.length - 1; i >= 0; i--) { + if (predicate(t[i])) { + continue; + } + + return t.slice(0, i + 1); + } + + return []; +} + export async function splitToEnd(readable: Readable, splitter: ChunkSplitter) { const results: Buffer[][] = [[]]; @@ -8,9 +24,7 @@ export async function splitToEnd(readable: Readable, splitter: ChunkSplitter) { while (chunk) { const [c1, c2] = splitter(chunk, readable.readableEncoding ?? 'utf-8'); results[results.length - 1].push(c1); - if (!c2?.length) { - break; - } else if (c2) { + if (c2) { chunk = c2; results.push([]); } else { @@ -19,7 +33,11 @@ export async function splitToEnd(readable: Readable, splitter: ChunkSplitter) { } } - return results.map((b) => Buffer.concat(b)); + // Remove all trailing empty arrays + return trimRightIf( + results.map((b) => Buffer.concat(b)), + (t) => !t.length, + ); } export function* chunkify(chunk: Buffer, length: number) {