From 671aed35a3ec2a5635c8f8b692df674f76e8981a Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Fri, 9 Sep 2022 15:30:09 +0900 Subject: [PATCH 1/3] Enable streaming in RSC responses --- packages/hydrogen/src/entry-server.tsx | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/hydrogen/src/entry-server.tsx b/packages/hydrogen/src/entry-server.tsx index 8938f134f8..a8c1dc0bd9 100644 --- a/packages/hydrogen/src/entry-server.tsx +++ b/packages/hydrogen/src/entry-server.tsx @@ -282,15 +282,25 @@ async function processRequest( const rsc = runRSC({App, state, log, request, response}); if (isRSCRequest) { - const buffered = await bufferReadableStream(rsc.readable.getReader()); - postRequestTasks('rsc', 200, request, response); - response.headers.set('cache-control', response.cacheControlHeader); - cacheResponse(response, request, [buffered], revalidate); - - return new Response(buffered, { - headers: response.headers, + const {headers} = response; + const [rscReadableForResponse, rscReadableForCache] = rsc.readable.tee(); + + const cachePromise = bufferReadableStream( + rscReadableForCache.getReader(), + __HYDROGEN_WORKER__ ? undefined : (chunk) => nodeResponse!.write(chunk) + ).then((buffered) => { + if (!__HYDROGEN_WORKER__) nodeResponse!.end(); + return cacheResponse(response, request, [buffered], revalidate); }); + + request.ctx.runtime?.waitUntil?.(cachePromise); + + postRequestTasks('rsc', 200, request, response); + + return __HYDROGEN_WORKER__ + ? new Response(rscReadableForResponse, {headers}) + : undefined; } if (isBotUA(url, request.headers.get('user-agent'))) { From 9288cb5cc6e2dd295f7981eb50391b047cb07b2d Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Fri, 9 Sep 2022 15:48:56 +0900 Subject: [PATCH 2/3] Fix e2e --- packages/playground/server-components/tests/e2e-test-cases.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/playground/server-components/tests/e2e-test-cases.ts b/packages/playground/server-components/tests/e2e-test-cases.ts index 798cfc3e17..68c9234cb9 100644 --- a/packages/playground/server-components/tests/e2e-test-cases.ts +++ b/packages/playground/server-components/tests/e2e-test-cases.ts @@ -213,7 +213,7 @@ export default async function testCases({ expect(body).toContain('>footer!<'); }); - it('buffers the RSC response', async () => { + it('streams the RSC response', async () => { const response = await fetch( getServerUrl() + `${RSC_PATHNAME}?state=` + @@ -229,7 +229,7 @@ export default async function testCases({ streamedChunks.push(chunk.toString()); } - expect(streamedChunks.length).toBe(1); + expect(streamedChunks.length).toBeGreaterThan(1); // Streamed more than 1 chunk const body = streamedChunks.join(''); expect(body).toContain('S1:"react.suspense"'); From 700526dc3a2a8583c796de3b9739201e1499b34d Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Fri, 9 Sep 2022 15:51:18 +0900 Subject: [PATCH 3/3] Fix cache-control --- packages/hydrogen/src/entry-server.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hydrogen/src/entry-server.tsx b/packages/hydrogen/src/entry-server.tsx index a8c1dc0bd9..772d4544ad 100644 --- a/packages/hydrogen/src/entry-server.tsx +++ b/packages/hydrogen/src/entry-server.tsx @@ -282,7 +282,6 @@ async function processRequest( const rsc = runRSC({App, state, log, request, response}); if (isRSCRequest) { - response.headers.set('cache-control', response.cacheControlHeader); const {headers} = response; const [rscReadableForResponse, rscReadableForCache] = rsc.readable.tee(); @@ -291,6 +290,7 @@ async function processRequest( __HYDROGEN_WORKER__ ? undefined : (chunk) => nodeResponse!.write(chunk) ).then((buffered) => { if (!__HYDROGEN_WORKER__) nodeResponse!.end(); + response.headers.set('cache-control', response.cacheControlHeader); return cacheResponse(response, request, [buffered], revalidate); });