Summary

  • O rascunho de trabalho de Server-Sent Events publicado pelo W3C em 23 de abril de 2009 descreveu EventSource, que recebe atualizações do servidor como eventos por uma conexão HTTP.
  • Um evento podia trazer id. Após uma interrupção comum, o navegador levava o último ID em Last-Event-ID; um campo id vazio apagava o marcador.

O painel do pregão congela. Durante dois segundos, a hipótese de que todo mundo parou de negociar até parece simpática. Então chegam novos números e a brincadeira acaba: quantas cotações passaram enquanto a página estava muda? Uma sequência que retoma sem prestar contas pode parecer viva e ainda assim ter um buraco bem no meio.

O primeiro rascunho de Server-Sent Events, publicado pelo W3C em 23 de abril de 2009, apresentou EventSource. A página abria um endereço e se preparava para receber mensagens. O servidor mantinha uma resposta HTTP no formato text/event-stream; o navegador lia as linhas e entregava eventos completos ao código da página. Havia uma fita em movimento, mas também uma regra para saber onde terminava cada recado.

O exemplo de ações do documento cabia em três linhas de data: YHOO, +2, 10. Uma linha em branco encerrava o bloco. O navegador despachava um evento com os três valores, e a página os separava para atualizar o quadro. A linha em branco fazia o serviço humilde de um ponto final. Sem ela, o fluxo seria uma pilha de pedaços chegando sem cerimônia.

Outro exemplo trazia a peça mais interessante: data: first event junto de id: 1. O navegador guardava o número. Se a conexão caísse antes do recado seguinte, a nova requisição incluiria Last-Event-ID: 1. O rascunho de última chamada de dezembro de 2009 preservou esse mecanismo. Em vez de voltar ao balcão e pedir “o que aconteceu enquanto eu estava fora?”, o cliente podia entregar um marcador preciso.

Esse número era uma pista para o servidor, não um arquivo que brotava dentro do navegador. Se o serviço mantivesse os eventos anteriores, poderia escolher de onde retomar. Se apagasse o histórico ao fim do dia, teria de resolver a volta de outra maneira. O prazo de guarda, a troca de sessão e a resposta a uma posição antiga eram decisões de quem administrava a fita. O navegador conhecia sua última notícia; o servidor conhecia seu acervo. O protocolo fez os dois se falarem.

O próprio rascunho ensinava a jogar fora um marcador velho. Um evento posterior tinha o campo id sem valor. Isso limpava o ID lembrado; na próxima reconexão, Last-Event-ID ficaria de fora. Parece um detalhe de rodapé, até chegar o fechamento do pregão. O número da fita de ontem não precisa mandar na primeira notícia de hoje. O remetente ganhava uma forma de encerrar um capítulo sem pedir que o navegador guardasse a página para sempre.

Também se podia mandar uma linha começando por dois-pontos. Ela era comentário, não uma notícia a ser mostrada. A Recomendação de fevereiro de 2015 observou que comentários periódicos ajudavam em caminhos onde certos proxies antigos derrubavam conexões quietas. A especificação descreveu ainda retry para ajustar a espera entre tentativas e a resposta HTTP 204 No Content para mandar o navegador parar de reconectar. O operador do feed podia dar um sinal de vida ou fechar a porta ao fim da sessão.

O histórico de publicações do W3C registra o percurso dos rascunhos de 2009 até a Recomendação de 2015, passando por uma versão candidata em 2012. O desenho que atravessou esse caminho era econômico: linhas de texto para as notícias, um ID para a posição, uma nova requisição quando o fio quebrasse. Nenhuma das partes precisava fingir que a interrupção havia sido uma pausa elegante do mercado.

Web Workers, tema de outra reportagem desta série, resolveram uma dor diferente. O worker faz uma conta longa fora do espaço em que a página atende os cliques. EventSource recebe novidades de um servidor e leva uma posição de volta quando a conexão cai. Nos dois casos há mensagens. Aqui, a pergunta que importa é quem sabe qual foi o último recado visto e quem tem condições de entregar o próximo. O pregão pode ser barulhento; a resposta cabe num número.