CreaRack-SL

DCA · Arquitectura (frontend / backend / PWA)

Conceptoactivecreado Thu Jun 11#dca-tech#arquitectura#flask#vanilla-js#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.js migrado a Pointer Events → paridad ratón + soporte táctil (1 dedo arrastra, 2 dedos pan+pinch, long-press = menú, doble-tap = rename), targets ≥44px en pointer: 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]]