Senders y Sistema de Jerarquía
Concepto de Sender
Cada dominio de la app registra un "sender" (identificador de cola). Las requests se agrupan por sender y se procesan en orden FIFO dentro de cada sender. Un sender puede tener sub-senders dinámicos (ej: sampling-2024).
Senders registrados
| Sender | Servicio | Jerarquía | Descripción |
|---|---|---|---|
field | FarmHttpService | 2 (alta) | Crear lotes |
scouting | ScoutingService | 1 | Monitoreos: crear, cerrar, estaciones, adversidades |
sampling | SamplingHttpService | 1 | Muestreos (sub-sender dinámico: sampling-{yeargroup}) |
mzone | MZoneService | 1 | Zonas de manejo: CRUD spots, tags, variables |
mzone-img | MZoneService | 1 | Imágenes de zonas de manejo (PUTF) |
tags | TagService | 1 | Tags de usuario |
weather | WeatherService | — | Registro de lluvias (no registra jerarquía explícita → default 0) |
evtSDK | SdkTrackService | 1 | Eventos de tracking del SDK |
apps | AppsService (via AppsStore.SENDER) | 1 | Storage de apps del marketplace |
lang | LangService | — | Cambio de locale (no registra jerarquía → default 0) |
Sistema de jerarquía
La jerarquía determina el orden de prioridad entre senders. Un sender con jerarquía mayor se procesa primero.
// OfflineStore
hierarchy: { [hierarchy: number]: Array<string> } = {};
waiting: { [hierarchy: number]: Array<string> } = { 0: [] };
Ejemplo de estado
hierarchy = {
1: ["scouting", "sampling", "mzone", "mzone-img", "tags", "evtSDK", "apps"],
2: ["field"]
}
Lógica de prioridad
Cuando un sender quiere enviar (sendNext):
- Se calcula
highestHierarchy: el nivel más alto que tiene requests pendientes. - Si el sender tiene jerarquía >=
highestHierarchy, envía. - Si no, se agrega a
waiting[hierarchy]y se fuerza el envío de los senders de mayor jerarquía. - Cuando los senders de mayor jerarquía terminan, se procesan los que estaban en waiting.
Ejemplo práctico: Si hay requests pendientes de field (jerarquía 2) y de scouting (jerarquía 1), primero se procesan todas las de field antes de continuar con scouting.
Sub-senders
Algunos senders usan sufijos dinámicos (ej: sampling-2024). La jerarquía se resuelve por el prefijo antes del -:
this.offlineStore.hierarchy[key].indexOf(sender.split('-')[0])
Envío secuencial
Dentro de cada sender, las requests se envían una a una (FIFO). No hay paralelismo entre requests del mismo sender. Senders distintos pueden enviar en paralelo si están en la misma jerarquía.
Flag de estado
sending: { [sender: string]: boolean } = {}; // true si el sender está enviando
isSyncing: boolean = false; // true si algún sender está enviando