Estoy usando eventos enviados por el servidor (SSE) y mi código para conectarme a mi backend SSE se ve así:
function sseSubscribe() { events = new EventSource("/v1/sse/" + sseID + "/" + lastEventId); events.addEventListener("message", sseHeartbeat); events.addEventListener("error", sseError); events.addEventListener("reply", sseReply); events.addEventListener("refresh", sseRefresh); }
Esta función se llama para configurar la conexión SSE inicial, pero también cuando se desea una reconexión (porque la conexión se interrumpió por cualquier motivo).
En el servidor, si lastEventId
es mayor que 0, transmitirá los mensajes faltantes al cliente.
Entonces, hipotéticamente, si se bloqueara new EventSource()
, esto no funcionaría, porque los eventos se transmitirían de vuelta al navegador antes de que se registraran los controladores de eventos correspondientes (respuesta, actualización, etc.).
Sin embargo, que yo sepa, este no es el caso (creo que llamar a un new EventSource
es una operación sin bloqueo, aunque no estoy seguro). Sin embargo, supongo que es posible que si la computadora del usuario fuera lo suficientemente lenta y su conexión lo suficientemente rápida, tal vez los mensajes faltantes podrían transmitirse antes de que se registraran los oyentes.
¿Es este un temor razonable o debería sentirme relativamente seguro con el código anterior?
Para reiterar, este código parece funcionar, pero mi temor es que los mensajes se transmitan desde la nueva conexión de EventSource antes de que se agreguen los controladores correspondientes. ¿Es esto razonable, o tiene un 0% de probabilidad de que suceda?
La conexión se produce después de que se haya completado la ejecución actual de Javascript. Creo que sería seguro asumir esto para todos los navegadores, aunque no tengo una referencia definitiva.
Por ejemplo, Chrome inicia la conexión desde un temporizador, que probablemente se vincula con el mismo bucle de eventos que, por ejemplo, setTimeout
: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/ renderer/modules/eventsource/event_source.cc;l=99?q=EventSource&ss=chromium