WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

The Node.js adapter fires the request abort signal on every successful request completion, not just on client disconnects. #152

@dcitron

Description

@dcitron

Environment

[email protected]
node@lts/jod

Reproduction

const server = serve({
  port: 3000,
  fetch(request) {
    request.signal.addEventListener("abort", () => {
      console.log("ABORT FIRED"); // This fires on EVERY request
    });
    return new Response("ok");
  },
});

Describe the bug

Cause

In src/adapters/_node/request.ts, the _abortController getter listens to req.once("end", abort). The end event on IncomingMessage fires when the request body is done being read, not when the client disconnects.

Impact

  • OpenTelemetry traces show every request as "aborted"
  • Any code checking request.signal.aborted sees incorrect state
  • Streaming responses don't behave correctly

Expected behavior

Abort signal should only fire when:

  • Client disconnects before response completes
  • Request errors

This matches Bun's behavior and @hono/node-server's implementation.

Solution

Listen to res.on("close") and check res.writableEnded instead. PR incoming.

Additional context

No response

Logs

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions