[Feat]: Better DX for Abort events
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 5.9k
- Forks
- 426
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 11
Description
Duplicates
- I have searched the existing issues
Latest version
- I have tested the latest version
Current behavior 😯
When the request is aborted, the abort event is not fired within server API route.
Example server API route
import type { APIEvent } from "@solidjs/start/server";
export async function GET(event: APIEvent) {
event.request.signal.addEventListener("abort", () => {
console.log('abort detected')
})
let i = 0;
while (i < 20) {
console.log('looping', i++, event.request.signal.aborted)
await new Promise(resolve => setTimeout(resolve, 1000))
}
return new Response(null, { status: 200 })
}
Example browser triggers
<button
onClick={() => {
controller = new AbortController();
fetch("/api/test", {
method: "GET",
signal: new AbortController().signal,
})
.then((response) => {
console.log("response", response);
})
.catch((error) => {
console.log("error", error);
});
}}
>
Call
</button>
<button
onClick={() => {
console.log("controller", controller);
controller?.abort("I am aborting this request");
controller = undefined;
}}
>
Abort
</button>
Expected behavior 🤔
When user cancel the request in browser, the abort event should be fired.
Steps to reproduce 🕹
Steps:
- Create an API route
- Add abort listener inside the API route
- In the browser, fetch & abort
- Notice that the abort event is not fired inside the API route
Context 🔦
I'm building an AI chat app that streams the token from the AI provider back to the user.
Currently when the user clicks aborting the request, the api route could not detect that and keep streaming from the AI provider, wasting token.
Not sure if related but Next.js used to have a similar issue https://github.com/vercel/next.js/discussions/48682
Your environment 🌎
Linux denpa 6.12.10-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 18 Jan 2025 02:26:57 +0000 x86_64 GNU/Linux
bun --version
1.2.0
node --version
v23.4.0
"dependencies": {
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.15.0",
"@solidjs/start": "^1.0.11",
"solid-js": "^1.9.2",
"vinxi": "^0.4.3"
},
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing how a server API route receives event.request and its AbortSignal, then compare that path with the browser fetch and AbortController reproduction. Verify whether cancellation reaches the server while the route is waiting and streaming; done means the route's abort listener fires when the browser cancels the request and the reproduction no longer continues unnecessary work.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, backend
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100