SSE — односторонний поток server→client поверх обычного HTTP. Формат простой: поля id, event, data, retry и пустая строка запускает dispatch события.
Разбор
Wire format — четыре опциональных поля, по одному на строку; blank line = dispatch:
id: 42 ← becomes Last-Event-ID on the next reconnect
event: price ← named event; defaults to "message"
data: {"usd":93} ← multiple data: lines are joined with \n
retry: 5000 ← client's reconnect delay, in ms
← blank line = "dispatch now"
Reconnection — killer feature. При обрыве EventSource ждёт retry ms и снова делает GET, автоматически шлёт Last-Event-ID: с последним id:. Если сервер honour header и replay missed events — at-least-once delivery через network blips без client bookkeeping.
Rides on HTTP — двойной edge. На HTTP/2/3 multiplexed — много stream на одном connection. На HTTP/1.1 каждый SSE stream навсегда занимает одно из ~6 connections-per-origin — шесть вкладок с dashboard и седьмая tab's fetch висит. Самый частый production surprise.
Итог
SSE = текстовый event stream + auto-reconnect с Last-Event-ID; на HTTP/1.1 следите за лимитом connections per origin.
Server-Sent Events (SSE): как это работает на практике · Sobeso