Horse Streaming Development Guide
Esta skill guia o desenvolvimento, depuração e manutenção de fluxos de streaming de dados (Web Streams / SSE) no framework Horse.
🟢 Conceitos Fundamentais
- Web Streams (NDJSON): Envio de dados formatados como múltiplos JSONs delimitados por quebras de linha (
\n), utilizando o cabeçalhoTransfer-Encoding: chunked. - Server-Sent Events (SSE): Fluxo unidirecional persistente onde o servidor envia eventos estruturados sob o formato
event: message\ndata: ...\n\ncom o Content-Typetext/event-stream.
🟢 Como usar nas Rotas do Horse
Para enviar dados via streaming, o manipulador da rota deve definir o ContentType adequado e invocar o Res.SendStream:
THorse.Get('/stream',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Res.ContentType('application/x-ndjson; charset=utf-8');
Res.SendStream(
procedure(const AWriter: IHorseStreamWriter)
begin
if AWriter.IsConnected then
AWriter.Write('{"data": "teste"}'#10);
end);
end);
🟢 Implementação dos Provedores Físicos
Ao criar ou estender novos provedores lógicos de transporte no Horse:
- Deve-se herdar uma classe especializada de
THorseStreamWriterBasee implementar os métodosWrite(escrita física),IsConnected(validação física de conectividade do socket) eClose(fim de transmissão/descarregamento de buffers). - Registrar a fábrica através de
THorseResponse.RegisterStreamWriterFactory(Factory).
🟢 Peculiaridades por Provedor
Indy (TIdHTTPAppResponse)
- Conexão: A thread física é acessada via o campo
FThreadda Friend Class. - Envio de Headers: Invocar
MoveCookiesAndCustomHeadersdoTIdHTTPAppResponsepara carregar headers customizados e cookies antes doWriteHeader. - Flag de Envio: Marcar
FSent := TruenoTIdHTTPAppResponsepara impedir que o WebBroker dispare novamente os headers no fim do dispatcher. - Bypass de HTML do Indy: Preencher
ContentStreamcom umTMemoryStreamvazio,FreeContentStream := TrueeContentLength := 0para desativar a injeção do HTML default de 200 OK de 39 bytes pelo Indy.