Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

`fetchEventSource` doesn't abort when passing in an already aborted signal

Abierto
#98 0 comentarios 9 reacciones 0 asignados Ver en GitHub

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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Azure/fetch-event-source

Todos los issues de Azure/fetch-event-source

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.