Skip to content

Commit 07bef21

Browse files
authored
fix(@netlify/remix-edge-adapter): don't close the stream twice (#444)
1 parent 2c5833c commit 07bef21

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

packages/remix-edge-adapter/src/common/entry.server.tsx

+21-2
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,42 @@ export default async function handleRequest(
1919
remixContext: EntryContext,
2020
_loadContext: AppLoadContext,
2121
) {
22+
let isStreamClosing = false
23+
24+
const abortController = new AbortController()
25+
request.signal.addEventListener('abort', () => {
26+
if (!isStreamClosing) {
27+
// only signal the abort if the stream is not already closing
28+
abortController.abort(request.signal.reason)
29+
}
30+
})
31+
2232
// The main difference between this and the default Node.js entrypoint is
2333
// this use of web streams as opposed to Node.js streams.
2434
const body = await ReactDOMServer.renderToReadableStream(<RemixServer context={remixContext} url={request.url} />, {
25-
signal: request.signal,
35+
signal: abortController.signal,
2636
onError(error: unknown) {
2737
// Log streaming rendering errors from inside the shell
2838
console.error(error)
2939
responseStatusCode = 500
3040
},
3141
})
3242

43+
// identity transform just to be able to listen for the flush event
44+
const transformedBody = body.pipeThrough(
45+
new TransformStream({
46+
flush() {
47+
isStreamClosing = true
48+
},
49+
}),
50+
)
51+
3352
if (isbot(request.headers.get('user-agent') || '')) {
3453
await body.allReady
3554
}
3655

3756
responseHeaders.set('Content-Type', 'text/html')
38-
return new Response(body, {
57+
return new Response(transformedBody, {
3958
headers: responseHeaders,
4059
status: responseStatusCode,
4160
})

0 commit comments

Comments
 (0)