DCA · Arquitectura (frontend / backend / PWA)
DCA · Arquitectura
DCA es vanilla ES6 sin build: index.html carga js_modules/main.js como módulo ES nativo (no hay bundle). El antiguo bundle esbuild quedó obsoleto y eliminado — fue causa de una caída en prod (el bundle gitignored nunca llegaba al servidor). Para entender el deploy ver [[runbook—dca-tech—deploy-hetzner]].
Backend (Python/Flask)
app.py # Entrada Flask (delega en backend_src)
backend_src/
├── app_setup.py # Factory + whitenoise
├── routes.py # /api/calculate_plan · /api/convert_pdf_to_image
├── planning_logic.py # Motor: 2 pasadas (greedy + hill-climbing)
├── utils.py # Canales/ocupación 20MHz, vecinos, ángulos
├── metrics.py # Conflictos CCI/ACI internos/vecinos
└── constants.py
Errores de la API tipificados: {success:false, error, error_code, hint} con códigos BAD_REQUEST, INVALID_SETTINGS, NO_VALID_APS, TOO_MANY_APS, TOO_MANY_RADIOS, INTERNAL_ERROR. Límites de entrada: 200 APs / 1500 radios por request. Presupuesto de tiempo cooperativo de 45 s. Detalle del motor en [[concept—dca-tech—algoritmo-planificacion]].
Frontend (~25 módulos ES6)
main, appState, canvasView, canvasInteraction, fileManager, exportService, plannerService, uiManager, projectStore, autosaveManager… más planningWorker.js (Web Worker que hace POST /api/calculate_plan).
- Interacción:
canvasInteraction.jsmigrado a Pointer Events → paridad ratón + soporte táctil (1 dedo arrastra, 2 dedos pan+pinch, long-press = menú, doble-tap = rename), targets ≥44px enpointer: coarse. - Persistencia: autosave on-change (debounce 5 s) en IndexedDB (
projectStore.js) con fallback a localStorage; validación + rollback al cargar proyecto. Formato JSON “DomoChannelSave_1.2” (incluye el plano como dataURL).
PWA (offline)
sw.js + manifest.webmanifest. Estrategia: navegación app-shell cache-first (el index.html se sirve de la MISMA caché que los módulos JS → actualización atómica) + skipWaiting automático (el SW nuevo se auto-activa). Revertir a network-first recrea el bug “Critical error during application initialization” (HTML nuevo + JS viejo).
Decisión de stack
NO añadir frameworks JS ni dependencias Python sin justificación fuerte. La filosofía de DCA es 3 deps + vanilla — ver [[concept—dca-tech—overview]].
Véase también
- [[concept—dca-tech—overview]]
- [[concept—dca-tech—algoritmo-planificacion]]
- [[runbook—dca-tech—deploy-hetzner]]