partytracks: createAudioSink().attach throws on a synchronous track, and a failed track close is an unhandled rejection
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 70/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript
- Área
- audio-video-rtc
Línea de trabajo
Empieza en packages/partytracks/src/client/audioSink.ts, donde attach() se suscribe a track$ y llama a sub.add dentro del callback, y reproduce el problema con una fuente síncrona como of(track). El segundo error está en el método del cliente #closeTrackInBulk, que parsea la respuesta de tracks/close y pasa sessionDescription a setRemoteDescription; localízalo buscando closeTrackInBulk. Se considera terminado cuando attach funciona con un track síncrono y un cierre fallido no lanza una excepción sin manejar ni renegocia una vez que la conexión peer está cerrada.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Two bugs in partytracks 0.0.56 (also on main), found while running Cloudflare Realtime calls in production-like tests.
1. createAudioSink().attach throws when the track emits synchronously
attach(track$) calls track$.subscribe(...) and, inside the callback, sub.add(...). When track$ emits synchronously (for example an already-pulled track behind shareReplay), the callback runs before sub is assigned:
ReferenceError: Cannot access 'sub' before initialization
Reproduction:
import { of } from "rxjs";
createAudioSink({ audioElement: new Audio() }).attach(of(track));
Suggested fix (packages/partytracks/src/client/audioSink.ts): create the subscription first and add the inner one to it:
const sub = new Subscription();
sub.add(
pulledAudioTrack$.subscribe((track) => {
mediaStream.addTrack(track);
resetSrcObject();
sub.add(() => {
mediaStream.removeTrack(track);
resetSrcObject();
});
}),
);
2. A failed track close is an unhandled rejection
#closeTrackInBulk parses the tracks/close response as JSON and passes response.sessionDescription to setRemoteDescription without checking either. A close that races the end of a session becomes an unhandled rejection in the page: the server refuses it in plain text (so response.json() throws), or the SFU answers 410 because the session has gone (so setRemoteDescription gets undefined). Nothing awaits doBulkRequest there, so the caller cannot catch it.
This happens routinely when one participant leaves just as a call ends: the others stop receiving their tracks while the session is being torn down.
Suggested: check response.ok before parsing, and drop the failure when the peer connection has closed meanwhile (peerConnection.connectionState === "closed"), since there is nothing left to renegotiate.
We carry both fixes as a local patch for now and would be glad to drop it.
- Lenguaje dominante
- TypeScript
- Estrellas
- 1.3k
- Forks
- 83
- 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 cloudflare/partykit
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
cloudflare/partykit#424 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
cloudflare/partykit#423 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
cloudflare/partykit#419 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
cloudflare/partykit#411 ·
-
[y-partyserver] provider.destroy() leaks reconnect timer, hanging Node processes and delaying GCAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
cloudflare/partykit#402 · 1 comentario ·
Todos los issues de cloudflare/partykit
Issues similares
-
New icon: `filter-clear`Abiertocalcite-ui-icons enhancement impact - p3 - not time sensitive needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
Esri/calcite-design-system#15467 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
diegosouzapw/OmniRoute#18390 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 86/100
guilhermerodz/input-otp#157 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
davidjerleke/embla-carousel#1414 ·
Los mantenedores suelen responder en 4 días