From 35d05e90ae5ab2cf5fcba16ead3c945eeb5debac Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Sun, 2 Oct 2022 10:32:05 +0200 Subject: [PATCH] chore: added the edge-function helper to simulated the unhandlerejection on wrong types written to a response-stream. --- packages/next/server/body-streams.ts | 17 ----------------- packages/next/server/dev/next-dev-server.ts | 20 +++++++++++--------- packages/next/server/next-server.ts | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/packages/next/server/body-streams.ts b/packages/next/server/body-streams.ts index f5bd6dfe172bc..0951502f5b7a3 100644 --- a/packages/next/server/body-streams.ts +++ b/packages/next/server/body-streams.ts @@ -17,23 +17,6 @@ export function requestToBodyStream( }) } -export function bodyStreamToNodeStream( - bodyStream: ReadableStream -): Readable { - const reader = bodyStream.getReader() - return Readable.from( - (async function* () { - while (true) { - const { done, value } = await reader.read() - if (done) { - return - } - yield value - } - })() - ) -} - function replaceRequestBody( base: T, stream: Readable diff --git a/packages/next/server/dev/next-dev-server.ts b/packages/next/server/dev/next-dev-server.ts index 6f45bf88cb0ab..017e7a1c18d36 100644 --- a/packages/next/server/dev/next-dev-server.ts +++ b/packages/next/server/dev/next-dev-server.ts @@ -981,16 +981,18 @@ export default class DevServer extends Server { try { return await super.run(req, res, parsedUrl) } catch (error) { - res.statusCode = 500 const err = getProperError(error) - try { - this.logErrorWithOriginalStack(err).catch(() => {}) - return await this.renderError(err, req, res, pathname!, { - __NEXT_PAGE: (isError(err) && err.page) || pathname || '', - }) - } catch (internalErr) { - console.error(internalErr) - res.body('Internal Server Error').send() + this.logErrorWithOriginalStack(err).catch(() => {}) + if (!res.sent) { + res.statusCode = 500 + try { + return await this.renderError(err, req, res, pathname!, { + __NEXT_PAGE: (isError(err) && err.page) || pathname || '', + }) + } catch (internalErr) { + console.error(internalErr) + res.body('Internal Server Error').send() + } } } } diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts index 7e75c9dc575ef..9e47fa3eef930 100644 --- a/packages/next/server/next-server.ts +++ b/packages/next/server/next-server.ts @@ -68,6 +68,7 @@ import { ParsedUrl, parseUrl } from '../shared/lib/router/utils/parse-url' import { parse as nodeParseUrl } from 'url' import * as Log from '../build/output/log' import loadRequireHook from '../build/webpack/require-hook' +import { consumeUint8ArrayReadableStream } from 'next/dist/compiled/edge-runtime' import BaseServer, { Options, @@ -95,7 +96,7 @@ import { getCustomRoute, stringifyQuery } from './server-route-utils' import { urlQueryToSearchParams } from '../shared/lib/router/utils/querystring' import { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash' import { getNextPathnameInfo } from '../shared/lib/router/utils/get-next-pathname-info' -import { bodyStreamToNodeStream, getClonableBody } from './body-streams' +import { getClonableBody } from './body-streams' import { checkIsManualRevalidate } from './api-utils' import { shouldUseReactRoot, isTargetLikeServerless } from './utils' import ResponseCache from './response-cache' @@ -2112,9 +2113,16 @@ export default class NextNodeServer extends BaseServer { if (result.response.body) { // TODO(gal): not sure that we always need to stream - bodyStreamToNodeStream(result.response.body).pipe( - (params.res as NodeNextResponse).originalResponse - ) + const nodeResStream = (params.res as NodeNextResponse).originalResponse + try { + for await (const chunk of consumeUint8ArrayReadableStream( + result.response.body + )) { + nodeResStream.write(chunk) + } + } finally { + nodeResStream.end() + } } else { ;(params.res as NodeNextResponse).originalResponse.end() }