`fetchEventSource` doesn't abort when passing in an already aborted signal
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- typescript
- Área
- api
Línea de trabajo
Comienza en la implementación de fetchEventSource mostrada en el issue y reproduce el caso con una señal de AbortController ya abortada. Verifica que la solicitud se aborte inmediatamente y se rechace con el error de aborto; después, añade o actualiza la cobertura de este comportamiento si se puede identificar la ubicación relevante de las pruebas.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Javascript's default fetch rejects with an AbortError when passing an already aborted signal:
const controller = new AbortController()
controller.abort()
await fetch("https://google.com", { signal: controller.signal })
Uncaught:
DOMException [AbortError]: This operation was aborted
at node:internal/deps/undici/undici:13392:13
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async REPL17:1:33
However, when using fetch-event-source it fails to detect that the signal is already aborted:
const controller = new AbortController()
controller.abort()
await fetchEventSource("https://any-website-supporting-sse.com", { signal: controller.signal })
// the call above is never aborted
This doesn't abort the fetch.
The reason is that fetchEventSource creates a new aborter and subscribes to the original signal's abort event to then abort its own controller, but the abort event does not trigger retroactively (i.e. if the signal is already aborted). Here's the relevant snippet from the fetchEventSource implementation:
let curRequestController: AbortController;
function dispose() {
// ...
curRequestController.abort();
}
inputSignal?.addEventListener('abort', () => {
// this callback is not called if the inputSignal is already aborted!
// hence, curRequestController is not aborted
dispose();
resolve();
});
async function create() {
curRequestController = new AbortController();
try {
const response = await fetch(input, {
...rest,
headers,
signal: curRequestController.signal,
});
// ...
} catch (err) {
if (!curRequestController.signal.aborted) {
// ...
}
}
};
I patched it locally as follows:
inputSignal?.addEventListener('abort', () => {
dispose();
// no longer resolving the promise here
// because 1) we should reject instead of resolve when aborted
// and 2) dispose() will abort the curRequestController.signal
// which will cause the ongoing fetch request to throw an AbortError
// which we will catch and then we will reject the promise with the error
});
async function create() {
curRequestController = new AbortController();
// use the input signal if it is already aborted
const sig = inputSignal.aborted ? inputSignal : curRequestController.signal
try {
const response = await fetch(input, {
...rest,
headers,
signal: sig,
});
// ...
} catch (err) {
if (sig.aborted) {
dispose();
reject(err);
} else if (!curRequestController.signal.aborted) {
// ...
}
}
};
- Lenguaje dominante
- TypeScript
- Estrellas
- 2.9k
- Forks
- 197
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Azure/fetch-event-source
-
Dificultad 3/5 1-2 días Aptitud para principiantes 28/100
Azure/fetch-event-source#102 ·
-
how to stop retry when onerror?Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
Azure/fetch-event-source#101 · 3 comentarios ·
-
When aborting the event source using abort controller, no callbacks (onError / onClose) are firedAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
Azure/fetch-event-source#100 · 1 comentario · 5 reacciones ·
-
Weird Vite chunk map sourcesAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Azure/fetch-event-source#99 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
Azure/fetch-event-source#97 · 1 comentario ·
Todos los issues de Azure/fetch-event-source
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
cursor/community-plugins#465 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
vetro-protocol/vetro-monorepo#978 ·
Los mantenedores suelen responder en 1 día
-
ai-generated bug category:security effort:s priority:p3
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
LanternOps/breeze#9697 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
maniator/verticopolis#1303 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
components-web-app/docs#297 ·