向 EventSource 构造函数提供 Last-Event-Id

Provide Last-Event-Id to EventSource constructor

是否可以设置 EventSource 的 Last-Event-Id header?我有一个简单的聊天应用程序,可以缓存消息。当我连接时,我会发送自 Last-Event-Id 以来的所有聊天记录,如果未提供,我会发送所有聊天记录。

由于我保留了消息,我认为我可以将 Id 传递给 EventSource 构造函数以避免它返回我已经拥有的所有消息。这根本不可能吗?

您可以传递有关查询字符串的信息。

var source = EventSource("source?eventId=12345");

最终由您在服务器端理解它并 return 正确的事件。

如果连接中断并且客户端必须重新连接,EventSource 请求将只有 Last-Event-Id header。您可以通过让服务器断开第一个连接来“强制”重新连接。

它是这样的:

  1. 使用 EventSource 创建连接。
  2. 服务器接收请求并测试Last-Event-Id是否是一个请求header。
    • 如果 Last-Event-Id 存在:
      • 获得 value/id.
      • 根据id从服务器发送事件
    • 如果 Last-Event-Id 不存在:
      • 发送一个包含 id(您认为是最后一个 id)的事件。
      • 建立服务器 break/finish 连接。
  3. 如果连接被服务器中断,客户端将尝试重新连接一个新的请求。这次请求会有一个Last-Event-Idheader,现在你跳到2号

这种方法的唯一问题是客户端造成的延迟,因为它必须建立两个连接。我没有测试延迟,但看起来每次请求之间大约有 3-5 秒。