2.9 KiB
CLAUDE.md
Notas operativas para trabajar en este repo. El diseño completo está en
docs/DISENO.md.
Entorno de este servidor
- El
.envapunta a producción (SBOPRDLIBROS, SAP B1 sobre HANA). Cualquiernpm run run-once/npm startescribe en@OEVN/@EVN1y envía webhooks reales a la suscripción activa en@OEVC. - El dispatcher corre como servicio Windows NSSM
sap-legacy-webhook(cuenta LocalSystem). Detener el servicio antes de correrlo a mano (Stop-Service sap-legacy-webhook) y volver a iniciarlo después: dos procesos en paralelo comparten eventos y duplican entregas. - Los logs diarios (
logs/dispatcher-YYYY-MM-DD.log) los crea SYSTEM; un usuario normal no puede escribirlos. El logger cae a solo-consola en ese caso (no es un error).
Lecciones aprendidas (2026-10-20)
-
Ticks solapados: con backlog grande un tick dura más que
POLL_INTERVAL_SECONDS, y node-cron lanzaba otro en paralelo sobre la misma sesión de Service Layer →-2035 already existsen@EVN1y-1116(a veces "Unknown error", a veces violación deKEVN1_NAMEcon la clave de otro request). Corregido con el guardtickRunningensrc/index.ts. Si reaparecen-1116cruzados, sospechar concurrencia sobre la misma sesión antes que datos. -
Tamaño de lote: el receptor rechaza bodies grandes (HTTP 413). Los envíos se parten en lotes de
MAX_EVENTS_PER_BATCH(30 por defecto). -
Eventos atascados en
P: si el PATCH final de un tick falla, el evento queda enPcon todas sus entregas enD, y el dispatcher no lo recupera (solo recalcula eventos con entregas pendientes). Detectar con@OEVNenPvs@EVN1enF= 0; se corrigieron 733 a mano el 2026-10-20.
Versionado
SemVer en package.json, con tag vX.Y.Z en git por cada versión:
- patch: corrección sin cambio de comportamiento.
- minor: funcionalidad nueva compatible (ej. una variable nueva en
.env). - major: cambio incompatible (estructura de tablas, SP, formato del CloudEvent).
Al cerrar un cambio: npm version <patch|minor|major> --no-git-tag-version,
commit con el código, git tag -a vX.Y.Z -m "..." y
git push origin main --follow-tags.
Mejoras pendientes
- Lock de instancia única: archivo de bloqueo (ej.
logs/dispatcher.lockcon el PID) para que una segunda instancia —servicio o ejecución manual— se cierre al arrancar. Hoy solo lo evita la regla operativa de arriba. - Paralelizar llamadas al Service Layer dentro de un lote (GET de
eventos / PATCH de
@EVN1de a 5–10) para vaciar backlogs grandes más rápido. Cuidado: misma sesión de SL — validar que tolera concurrencia o usar sesiones separadas (ver lección de ticks solapados). - Causa del
-1116aislado: tras el fix de solapamiento no se volvió a ver; si aparece con un solo tick en curso, el log ahora indica método, ruta y body exactos.