📖 Descrição
Endpoint de Server-Sent Events (SSE) que transmite os preços atuais (ask/bid) de cada criptomoeda configurada no Looker, uma vez por segundo. Os preços são lidos diretamente doRealtimePriceCache, que é alimentado em tempo real pelos handlers WebSocket das exchanges.
Os preços dependem do fluxo WebSocket estar habilitado (
ENABLED_WEBSOCKET=1). Exchanges não cobertas por WebSocket retornarão eventos com stale: true.🛠️ Requisição
Método
GET
URL
Parâmetros de Caminho
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | string | Sim | ID do looker (ObjectID MongoDB) |
Headers Necessários
| Header | Valor |
|---|---|
Accept | text/event-stream |
Cache-Control | no-cache |
Exemplo de Requisição (curl)
Exemplo de Requisição (JavaScript)
📤 Resposta
Headers da Resposta
| Header | Valor |
|---|---|
Content-Type | text/event-stream |
Cache-Control | no-cache |
Connection | keep-alive |
X-Accel-Buffering | no |
Frequência de Emissão
A cada 1 segundo, são emitidos N eventos — um por cripto configurada no Looker (máximo 6). Todos os eventos do mesmo ciclo são seguidos de umFlush() para entrega atômica.
Formato dos Eventos SSE
Estrutura do Payload JSON
Campos do Payload
| Campo | Tipo | Descrição |
|---|---|---|
ticker | string | Par de trading em formato BASE-QUOTE (ex: BTC-USDT) |
exchange | string | Nome da exchange onde o Looker monitora essa cripto |
market | string | Tipo de mercado (SPOT ou FUTURES) |
ask | float | Melhor preço de venda (ask) atual |
bid | float | Melhor preço de compra (bid) atual |
volume | float | Volume de 24h (pode ter até 60s de defasagem) |
stale | boolean | true quando o dado tem mais de 10s ou a exchange não tem WebSocket |
updatedAt | string | Timestamp ISO 8601 do último tick recebido |
📝 Códigos de Resposta
200 OK +
Content-Type: text/event-stream: Stream aberto com sucesso. A conexão permanece aberta até o cliente fechar.400 Bad Request:
id parameter is required — Parâmetro id não informado na URL.404 Not Found:
looker not found — Looker com o ID fornecido não existe no banco.500 Internal Server Error:
SSE not supported by this server ou Failed to load looker.💡 Integração no Frontend (hook React)
O projeto já fornece o hookuseLookerStream em src/hooks/useLookerStream.js:
Retorno do Hook
| Propriedade | Tipo | Descrição |
|---|---|---|
prices | object | Mapa "ticker:exchange" → payload do evento SSE |
connected | boolean | true enquanto o EventSource estiver aberto |
⚠️ Considerações
Quando
stale: true, exiba um indicador visual (ícone de aviso, cor diferente) ao usuário para indicar que o dado pode estar desatualizado. O campo é true quando o último tick recebido pelo WebSocket foi há mais de 10 segundos.Exchanges como Mercado Bitcoin e Novadax não possuem WebSocket público. Para cryptos monitoradas nessas exchanges, todos os eventos terão
stale: true. Uma melhoria futura pode adicionar fallback REST com polling de 5s para essas exchanges.A conexão SSE é mantida até o cliente desconectar (navegação, fechamento de aba). O servidor detecta a desconexão via
r.Context().Done() e encerra a goroutine imediatamente, sem leak de recursos.