API de Streaming de Eventos
API de streaming de eventos en tiempo real con consultas por ventana temporal, filtrado por viewport, selección automática de modo de respuesta y suscripciones WebSocket.
Última actualización: 2025-02-18
API de Streaming de Eventos
La API de Streaming de Eventos proporciona acceso eficiente a eventos logísticos para visualización en mapas, dashboards y analíticas. Selecciona automáticamente el formato de respuesta óptimo basándose en los parámetros de consulta.
500 eventos logísticos renderizados desde la API de streaming con selección automática de modo.
Endpoint Principal
/api/events/streamConsultar eventos dentro de una ventana temporal y viewport
Parámetros Requeridos:
| Parámetro | Tipo | Descripción |
|---|---|---|
from | ISO 8601 | Inicio de ventana temporal |
to | ISO 8601 | Fin de ventana temporal |
Parámetros Opcionales:
| Parámetro | Tipo | Descripción |
|---|---|---|
minLng | number | Límite oeste del viewport |
maxLng | number | Límite este del viewport |
minLat | number | Límite sur del viewport |
maxLat | number | Límite norte del viewport |
type | string | Filtrar por tipo de evento (entry, exit, placement, etc.) |
warehouse | number | Filtrar por ID de almacén |
limit | number | Máximo de eventos (por defecto: 10000) |
Modos de Respuesta
La API selecciona automáticamente el formato de respuesta óptimo:
| Rango Temporal | Cantidad de Eventos | Modo de Respuesta | Formato |
|---|---|---|---|
| < 1 día | < 10,000 | Eventos crudos | Puntos individuales |
| < 1 día | > 10,000 | Clusters espaciales | Agrupados con conteo |
| 1-7 días | Cualquiera | Buckets por hora | Agregados por hora |
| 7-30 días | Cualquiera | Buckets por día | Agregados por día |
| > 30 días | Cualquiera | Buckets por semana | Agregados por semana |
Respuesta de Eventos Crudos
{
"mode": "raw",
"total": 847,
"events": [
{
"id": "evt-001",
"type": "entry",
"lat": 25.6714,
"lng": -100.3097,
"timestamp": "2025-01-15T14:32:07Z",
"tu_id": "TU-2025-00042",
"operator": "carlos.mendez",
"warehouse": "Monterrey Hub"
}
]
}
Respuesta Agrupada
{
"mode": "clustered",
"total": 24500,
"clusters": [
{
"lat": 25.67,
"lng": -100.31,
"count": 342,
"types": { "entry": 120, "exit": 115, "placement": 107 }
}
]
}
Respuesta Agregada
{
"mode": "aggregated",
"total": 156000,
"buckets": [
{
"start": "2025-01-15T00:00:00Z",
"end": "2025-01-15T01:00:00Z",
"count": 245,
"byType": { "entry": 82, "exit": 78, "placement": 85 }
}
]
}
Suscripción WebSocket
Para actualizaciones en tiempo real, suscríbete al endpoint WebSocket:
const ws = new WebSocket('wss://your-app.com/api/events/ws');
ws.onopen = () => {
ws.send(JSON.stringify({
action: 'subscribe',
filters: {
warehouse: 1,
types: ['entry', 'exit', 'placement'],
},
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
// { type: 'event', payload: { ... } }
};
Tipos de Evento
| Tipo | Descripción | Frecuencia Típica |
|---|---|---|
entry | Vehículo ingresa a la instalación | 50-200/día |
exit | Vehículo sale de la instalación | 50-200/día |
placement | Activo colocado en slot | 200-500/día |
removal | Activo retirado del slot | 200-500/día |
verification | Verificación de supervisor | 100-300/día |
weighing | Medición de báscula | 50-200/día |
incident | Incidente de cumplimiento | 0-10/día |
motion | Detección de movimiento CCTV | 50-500/día |
Rendimiento
| Escenario | Latencia Objetivo | Real |
|---|---|---|
| 10k eventos en ventana | < 200ms | ~120ms |
| 50k eventos (agrupados) | < 300ms | ~200ms |
| 100k eventos (agregados) | < 400ms | ~250ms |
| 1M eventos (buckets semanales) | < 500ms | ~300ms |
Límites de Tasa
| Plan | Solicitudes/min | Ventana temporal máxima |
|---|---|---|
| Prueba gratuita | 30 | 24 horas |
| Profesional | 100 | 90 días |
| Empresarial | 500 | 1 año |
Integración del Cliente
import { useEvents } from '@/hooks/useEvents';
const {
events,
clusters,
isLoading,
totalCount,
renderMode,
} = useEvents({
timeWindow: { from, to },
bounds: { minLng, minLat, maxLng, maxLat },
enabled: true,
});
// renderMode: 'raw' | 'clustered' | 'aggregated'
// Events are automatically cached with 5-min TTL
Gestión de Memoria
La caché del lado del cliente mantiene un máximo de 5 segmentos temporales (50MB). La política de evicción LRU elimina el segmento menos usado recientemente cuando uno nuevo se carga. Todas las solicitudes pendientes se cancelan al desmontar el componente.