Saltar al contenido principal

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

SenderServicioJerarquíaDescripción
fieldFarmHttpService2 (alta)Crear lotes
scoutingScoutingService1Monitoreos: crear, cerrar, estaciones, adversidades
samplingSamplingHttpService1Muestreos (sub-sender dinámico: sampling-{yeargroup})
mzoneMZoneService1Zonas de manejo: CRUD spots, tags, variables
mzone-imgMZoneService1Imágenes de zonas de manejo (PUTF)
tagsTagService1Tags de usuario
weatherWeatherServiceRegistro de lluvias (no registra jerarquía explícita → default 0)
evtSDKSdkTrackService1Eventos de tracking del SDK
appsAppsService (via AppsStore.SENDER)1Storage de apps del marketplace
langLangServiceCambio 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):

  1. Se calcula highestHierarchy: el nivel más alto que tiene requests pendientes.
  2. Si el sender tiene jerarquía >= highestHierarchy, envía.
  3. Si no, se agrega a waiting[hierarchy] y se fuerza el envío de los senders de mayor jerarquía.
  4. 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