EventSource 可能存在竞争条件?

Possible race condition with EventSource?

我正在使用服务器发送事件 (SSE),我连接到 SSE 后端的代码如下所示:

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);
}

此函数被调用以设置初始 SSE 连接,但 也会在需要重新连接时(因为连接因任何原因中断)。

在服务器上,如果 lastEventId 大于 0,它会将任何丢失的消息流式传输到客户端。

所以,假设,如果 new EventSource() 被阻止,这将不起作用,因为事件会在相应的事件处理程序(回复、刷新等)注册之前流回浏览器。

然而,据我所知,情况并非如此(我相信调用 new EventSource 是一个非阻塞操作?虽然不确定)。但是,我想 可能 如果用户的计算机足够慢,并且他们的连接足够快,那么 可能 丢失的消息可以在之前流式传输回来听众已注册。

这是一种合理的恐惧,还是我应该对上面的代码感到相对安全?

重申一下,此代码似乎有效,但我担心在添加相应的处理程序之前,消息可能会从新的 EventSource 连接流回。这是否合理,或者它发生的可能性为 0%?

连接在当前 Javascript 执行完成后发生。我相信这对所有浏览器来说都是安全的,尽管我没有明确的参考。

例如,Chrome 从计时器启动连接,该计时器可能绑定到与例如 setTimeout 相同的事件循环:https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/eventsource/event_source.cc;l=99?q=EventSource&ss=chromium