From ebc148ca80042c70df4c8c19169da81254c91394 Mon Sep 17 00:00:00 2001 From: Jacob Ebey Date: Wed, 23 Aug 2023 16:49:50 -0700 Subject: [PATCH] refactor(remix-node): remove recursion from stream utilities (#7245) --- .changeset/remove-stream-recursion.md | 5 +++ packages/remix-node/stream.ts | 46 +++++++++++---------------- 2 files changed, 23 insertions(+), 28 deletions(-) create mode 100644 .changeset/remove-stream-recursion.md diff --git a/.changeset/remove-stream-recursion.md b/.changeset/remove-stream-recursion.md new file mode 100644 index 00000000000..7f9c27061df --- /dev/null +++ b/.changeset/remove-stream-recursion.md @@ -0,0 +1,5 @@ +--- +"@remix-run/node": patch +--- + +remove recursion from stream utilities diff --git a/packages/remix-node/stream.ts b/packages/remix-node/stream.ts index 2d1f0af1742..00ea6026bdd 100644 --- a/packages/remix-node/stream.ts +++ b/packages/remix-node/stream.ts @@ -6,30 +6,24 @@ export async function writeReadableStreamToWritable( writable: Writable ) { let reader = stream.getReader(); + let flushable = writable as { flush?: Function }; - async function read() { - let { done, value } = await reader.read(); - - if (done) { - writable.end(); - return; - } + try { + while (true) { + let { done, value } = await reader.read(); - writable.write(value); + if (done) { + writable.end(); + break; + } - // If the stream is flushable, flush it to allow streaming to continue. - let flushable = writable as { flush?: Function }; - if (typeof flushable.flush === "function") { - flushable.flush(); + writable.write(value); + if (typeof flushable.flush === "function") { + flushable.flush(); + } } - - await read(); - } - - try { - await read(); - } catch (error: any) { - writable.destroy(error); + } catch (error: unknown) { + writable.destroy(error as Error); throw error; } } @@ -56,20 +50,16 @@ export async function readableStreamToString( let reader = stream.getReader(); let chunks: Uint8Array[] = []; - async function read() { + while (true) { let { done, value } = await reader.read(); - if (done) { - return; - } else if (value) { + break; + } + if (value) { chunks.push(value); } - - await read(); } - await read(); - return Buffer.concat(chunks).toString(encoding); }