Skip to content

Commit

Permalink
Fix adapter logic for aborting requests (Remix PR #10046)
Browse files Browse the repository at this point in the history
  • Loading branch information
brophdawg11 committed Oct 10, 2024
1 parent ebacd98 commit d386c0d
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
11 changes: 8 additions & 3 deletions packages/react-router-dev/vite/node-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,20 @@ export function fromNodeRequest(
let url = new URL(nodeReq.originalUrl, origin);

// Abort action/loaders once we can no longer write a response
let controller = new AbortController();
nodeRes.on("close", () => controller.abort());

let controller: AbortController | null = new AbortController();
let init: RequestInit = {
method: nodeReq.method,
headers: fromNodeHeaders(nodeReq.headers),
signal: controller.signal,
};

// Abort action/loaders once we can no longer write a response iff we have
// not yet sent a response (i.e., `close` without `finish`)
// `finish` -> done rendering the response
// `close` -> response can no longer be written to
nodeRes.on("finish", () => (controller = null));
nodeRes.on("close", () => controller?.abort());

if (nodeReq.method !== "GET" && nodeReq.method !== "HEAD") {
init.body = createReadableStreamFromReadable(nodeReq);
(init as { duplex: "half" }).duplex = "half";
Expand Down
11 changes: 8 additions & 3 deletions packages/react-router-express/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,20 @@ export function createRemixRequest(
let url = new URL(`${req.protocol}://${resolvedHost}${req.originalUrl}`);

// Abort action/loaders once we can no longer write a response
let controller = new AbortController();
res.on("close", () => controller.abort());

let controller: AbortController | null = new AbortController();
let init: RequestInit = {
method: req.method,
headers: createRemixHeaders(req.headers),
signal: controller.signal,
};

// Abort action/loaders once we can no longer write a response iff we have
// not yet sent a response (i.e., `close` without `finish`)
// `finish` -> done rendering the response
// `close` -> response can no longer be written to
res.on("finish", () => (controller = null));
res.on("close", () => controller?.abort());

if (req.method !== "GET" && req.method !== "HEAD") {
init.body = createReadableStreamFromReadable(req);
(init as { duplex: "half" }).duplex = "half";
Expand Down

0 comments on commit d386c0d

Please sign in to comment.