Completed requests leak listeners on caller-provided AbortSignals
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 74/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- typescript
Direzione di ricerca
Inizia in src/core.ts, in fetchWithTimeout(), soprattutto alle righe 549-550, e traccia come le richieste vengono completate nei percorsi di successo, errore, timeout e retry. Aggiungi una copertura per la pulizia dei listener in ogni percorso e verifica che il riutilizzo di un unico AbortSignal fornito dal chiamante non lasci listener dopo il completamento delle richieste.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
Every request made with a caller-provided AbortSignal permanently adds an abort listener to that signal.
At src/core.ts:549-550, fetchWithTimeout() calls:
if (signal) signal.addEventListener('abort', () => controller.abort());
The listener is never removed after the request settles. Reusing one signal across a batch therefore retains one internal AbortController closure per completed request.
Reproduction
import { getEventListeners } from 'node:events';
import Browserbase from '@browserbasehq/sdk';
const controller = new AbortController();
const client = new Browserbase({
apiKey: 'test',
maxRetries: 0,
fetch: async () =>
new Response('{}', {
status: 200,
headers: { 'content-type': 'application/json' },
}),
});
for (let i = 0; i < 12; i++) {
await client.get('/ok', { signal: controller.signal });
}
console.log(getEventListeners(controller.signal, 'abort').length); // 12
Expected behavior
A completed request removes its abort forwarding listener, leaving zero listeners after the loop.
Actual behavior
All 12 listeners remain attached. Retries add additional listeners because each attempt creates another controller.
Why this matters
Long-lived applications commonly share a signal across a batch of requests. Listener accumulation retains completed request state and can produce unbounded memory growth for large batches. The forwarding callback should be registered once/removed in cleanup (or use an equivalent combined-signal mechanism), with coverage for success, error, timeout, and retry paths.
Tested against @browserbasehq/sdk 2.18.0 / current main (b781bd7).
- Lingua principale
- TypeScript
- Stelle
- 65
- Fork
- 17
- Merge medio
- 16m
- PR unite (30g)
- 2
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di browserbase/sdk-node
-
Binary ArrayBufferView slices send the entire backing bufferForse già presa @abhinavkr26104 l’ha presa 50 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
browserbase/sdk-node#202 ·
-
content-length header collision → InvalidArgumentError: invalid content-length header when a custom undici global dispatcher is installedForse già presa @edenbuilds l’ha presa 50 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
browserbase/sdk-node#197 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
browserbase/sdk-node#193 ·
-
[Bug] contexts.delete() fails with 400 — same Content-Type issue as extensions.delete() (#169)Forse già presa @edenbuilds l’ha presa 59 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
browserbase/sdk-node#180 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 66/100
browserbase/sdk-node#218 · 2 commenti ·
Tutte le issue di browserbase/sdk-node
Issue simili
-
security-scan
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
[Studio feedback] 一轮对话的折叠Apertaenhancement from-studio
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
esengine/DeepSeek-Reasonix#12048 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
fix(data-lake): land GitHub callback failures on the lake instead of the home page (epic #3813)Apertabug data-lake github-integration UI/UX
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
test: pet colorsApertatestplan-item
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
bug claimable good first issue pillar/platforms
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
hurttlocker/o8#3277 ·
I maintainer di solito rispondono entro 1 giorno