Skip to content

Commit

Permalink
chore: added the edge-function helper to simulated the unhandlerejection
Browse files Browse the repository at this point in the history
       on wrong types written to a response-stream.
  • Loading branch information
mabels committed Oct 2, 2022
1 parent 082e3ac commit 35d05e9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 30 deletions.
17 changes: 0 additions & 17 deletions packages/next/server/body-streams.ts
Expand Up @@ -17,23 +17,6 @@ export function requestToBodyStream(
})
}

export function bodyStreamToNodeStream(
bodyStream: ReadableStream<Uint8Array>
): 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<T extends IncomingMessage>(
base: T,
stream: Readable
Expand Down
20 changes: 11 additions & 9 deletions packages/next/server/dev/next-dev-server.ts
Expand Up @@ -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()
}
}
}
}
Expand Down
16 changes: 12 additions & 4 deletions packages/next/server/next-server.ts
Expand Up @@ -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,
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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()
}
Expand Down

0 comments on commit 35d05e9

Please sign in to comment.