From 7dd808f7f34dde3e6da0bb431e040ff1572a622e Mon Sep 17 00:00:00 2001 From: apalchys Date: Wed, 26 Feb 2025 17:24:03 +0100 Subject: [PATCH] fix: support Web API ReadableStream when streamifyResponse:true --- packages/core/__tests__/index.js | 28 ++++++++++++++++++++++++++-- packages/core/index.js | 3 ++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/core/__tests__/index.js b/packages/core/__tests__/index.js index 2ecb88ec3..ee0edce84 100644 --- a/packages/core/__tests__/index.js +++ b/packages/core/__tests__/index.js @@ -932,11 +932,35 @@ test('Should return with streamifyResponse:true using empty body string and prel equal(content(), input) }) -test('Should return with streamifyResponse:true using ReadableStream', async (t) => { +// https://nodejs.org/api/stream.html#readable-streams +test('Should return with streamifyResponse:true using Node Readable stream', async (t) => { const input = 'x'.repeat(1024 * 1024) const handler = middy( async (event, context, { signal }) => { - return createReadableStream(input) + return createReadableStream(input) // returns Readable stream + }, + { + streamifyResponse: true + } + ) + + const { responseStream, chunkResponse } = createResponseStreamMockAndCapture() + const response = await handler(event, responseStream, context) + equal(response, undefined) + equal(chunkResponse(), input) +}) + +// https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream +test('Should return with streamifyResponse:true using Web API ReadableStream', async (t) => { + const input = 'x'.repeat(1024 * 1024) + const handler = middy( + async (event, context, { signal }) => { + return new ReadableStream({ + async start (controller) { + controller.enqueue(input) + controller.close() + } + }) }, { streamifyResponse: true diff --git a/packages/core/index.js b/packages/core/index.js index 0fdf81521..b42405e9d 100644 --- a/packages/core/index.js +++ b/packages/core/index.js @@ -1,5 +1,6 @@ /* global awslambda */ import { Readable } from 'node:stream' +import { ReadableStream } from 'node:stream/web' import { pipeline } from 'node:stream/promises' import { setTimeout } from 'node:timers' @@ -64,7 +65,7 @@ const middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => { } let handlerStream - if (handlerBody._readableState) { + if (handlerBody._readableState || handlerBody instanceof ReadableStream) { handlerStream = handlerBody } else if (typeof handlerBody === 'string') { // #1189