Dispatcher: evitar ticks solapados, enviar en lotes y mejorar logs

- index.ts: guard tickRunning; un tick largo ya no se solapa con el
  siguiente de node-cron (causaba -2035 en @EVN1 y -1116 cruzados por
  requests concurrentes sobre la misma sesion de Service Layer).
- process-tick.ts: un evento con error ya no corta el tick; progreso
  cada 100 eventos; envios en lotes de MAX_EVENTS_PER_BATCH (default 30)
  para no superar el tamano de body del receptor (HTTP 413).
- evn1-repository.ts: findExisting falla si el GET falla, en vez de
  tratarlo como "no existe" y crear un duplicado.
- service-layer-client.ts: errores incluyen metodo, ruta y body.
- logger.ts: no poder escribir el archivo de log no tumba el proceso.
- CLAUDE.md: notas operativas y mejoras pendientes.
This commit is contained in:
george.calle committed 2026-10-20 15:26:39 -03:00
1 parent 9e85c4cee8
commit 5a2e149825
8 files changed
+154 -45

No files matched your search

+12 -1
View File
@@ -34,9 +34,20 @@ function logFilePath(date: Date): string {
return `${LOGS_DIR}dispatcher-${day}.log`;
}
// No poder escribir el archivo de log (ej. creado por el servicio como
// SYSTEM y corrido a mano con otro usuario: EPERM) nunca debe tumbar el
// dispatcher a mitad de un tick — se avisa una vez y se sigue solo por consola.
let fileWriteFailed = false;
function write(level: string, message: string): void {
if (fileWriteFailed) return;
const now = new Date();
appendFileSync(logFilePath(now), `${localTimestamp(now)} [${level}] ${message}\n`);
try {
appendFileSync(logFilePath(now), `${localTimestamp(now)} [${level}] ${message}\n`);
} catch (err) {
fileWriteFailed = true;
console.warn(`[logger] No se pudo escribir ${logFilePath(now)} (${err instanceof Error ? err.message : String(err)}) — se sigue solo por consola.`);
}
}
// Errores de red de axios (ECONNREFUSED, timeout, DNS...): primero se