Сервер отправил события (SSE) - автомат c переподключение - PullRequest
1 голос
/ 01 мая 2020

У меня возникли проблемы с пониманием того, как "автомати c переподключение" работает для SSE.

Я читал документацию по Mozilla и WC3 и несколько других обсуждений, но все еще не уверен, как это работает.

https://html.spec.whatwg.org/multipage/server-sent-events.html https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events

Я реализовал SSE, используя gorilla / mux в Golang, и все это работает. Теперь, что интересно, я могу разорвать соединение с сервером, но оно будет волшебным образом восстановлено через несколько секунд. Я не реализовал никакой функциональности для этого сам, поэтому я не уверен, как это происходит?

Все основные браузеры будут пытаться автоматически переподключиться, однако я никогда не устанавливал вручную Event ID. Будет ли браузер переподключаться, но просто не получит потерянные данные, отправленные во время отключения? (это то, что может решить использование EventID, но меня это не интересует). Ie, может ли браузер переподключиться без использования EventID? Или это может быть что-то еще, что делает возможным это «переподключение»?

1 Ответ

1 голос
/ 02 мая 2020

Согласно спецификации клиент должен отправить заголовок Last-Event-Id, чтобы сообщить серверу о последнем событии id, которое оно успешно получило. Только когда события отправляются с полем id с пустым значением (отличается от простой отправки данных и полного пропуска id) Last-Event-Id сбрасывается на стороне клиента (вы можете думать об этом как о транзакциях блока ).

См. Раздел 5 Обработка модели в https://www.w3.org/TR/2009/WD-eventsource-20090421/

Если строка идентификатора последнего события источника события не является пустой строкой, тогда Last- HTTP-заголовок Event-Id должен быть включен в запрос, значение которого равно значению последней строки идентификатора события источника.

Это хорошее объяснение позже в разделе 7 Интерпретация потока событий, описывающего test-stream практический пример того, как Last-Event-Id, отправленный клиентской стороной, зависит от значения (и наличия) события id.

...