From f1aac90c7bafd82a680cf7d11ab810fad19d0d24 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 28 Jul 2022 02:50:51 -0500 Subject: [PATCH] Fix unhandled rejections with edge runtime (#39091) This corrects some unhandledRejection errors showing when a connection is canceled with the edge runtime since the changes needed for https://github.com/vercel/next.js/commit/14463ddd10eb24c308c96df12874fb9862abefe4. This also adds a regression test to ensure we don't have these class of errors in our middleware tests. ## Bug - [x] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` Fixes: [slack thread](https://vercel.slack.com/archives/C03Q1UU3Z4H/p1658960102013969) --- packages/next/server/body-streams.ts | 16 ++++++++++++---- test/e2e/middleware-rewrites/test/index.test.ts | 5 +++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/next/server/body-streams.ts b/packages/next/server/body-streams.ts index c31a037032ae..7218529a660a 100644 --- a/packages/next/server/body-streams.ts +++ b/packages/next/server/body-streams.ts @@ -56,9 +56,13 @@ export function getClonableBody( ): ClonableBody { let buffered: Readable | null = null - const endPromise = new Promise((resolve, reject) => { - readable.on('end', resolve) - readable.on('error', reject) + const endPromise = new Promise( + (resolve, reject) => { + readable.on('end', resolve) + readable.on('error', reject) + } + ).catch((error) => { + return { error } }) return { @@ -69,7 +73,11 @@ export function getClonableBody( */ async finalize(): Promise { if (buffered) { - await endPromise + const res = await endPromise + + if (res && typeof res === 'object' && res.error) { + throw res.error + } replaceRequestBody(readable, buffered) buffered = readable } diff --git a/test/e2e/middleware-rewrites/test/index.test.ts b/test/e2e/middleware-rewrites/test/index.test.ts index b9d61e50670d..2c84a9b8d978 100644 --- a/test/e2e/middleware-rewrites/test/index.test.ts +++ b/test/e2e/middleware-rewrites/test/index.test.ts @@ -680,6 +680,11 @@ describe('Middleware Rewrite', () => { logs.every((log) => log.source === 'log' || log.source === 'info') ).toEqual(true) }) + + it('should not have unexpected errors', async () => { + expect(next.cliOutput).not.toContain('unhandledRejection') + expect(next.cliOutput).not.toContain('ECONNRESET') + }) } function getCookieFromResponse(res, cookieName) {