Hybrid Backup Manager Skill
Este skill gestiona la salvaguarda de los datos críticos del sistema. Implementa una estrategia de respaldo 3-2-1 modificada para entornos web/locales híbridos, priorizando la seguridad (cifrado) y la consistencia en entornos con conectividad intermitente (Offline-First).
⚠️ Reglas Críticas (Hard Constraints)
- •Cifrado Obligatorio: Todo backup exportado fuera del entorno seguro del navegador (OPFS) debe estar cifrado con AES-256-GCM.
- •La clave de cifrado se deriva de una passphrase maestra usando PBKDF2 (mínimo 100k iteraciones).
- •Outbox Pattern:
- •Si no hay conexión, el backup se marca como
pending_syncen una tabla localsys_outbox. - •Un worker en segundo plano intenta sincronizar cuando detecta red.
- •Si no hay conexión, el backup se marca como
- •Formato:
- •Contenedor: ZIP o Blob binario propietario (
.aex). - •Contenido: Dump SQL completo + Metadatos JSON (checksum, timestamp, version).
- •Contenedor: ZIP o Blob binario propietario (
Flujo de Backup (Backup Flow)
1. Generación Local
- •
Snapshot:
db.export()(dump binario de SQLite/wa-sqlite). - •
Compresión: GZIP/Deflate (opcional).
- •
Cifrado:
typescriptconst iv = crypto.getRandomValues(new Uint8Array(12)); const encryptedData = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, key, dumpData ); - •
Empaquetado: Concatenar
Salt + IV + EncryptedData-> Archivo.aex. - •
Persistencia Local: Guardar en OPFS (
backups/backup-{timestamp}.aex).
2. Sincronización Remota (Hybrid)
- •Registrar evento en tabla
sys_outbox:- •
type: 'BACKUP_UPLOAD' - •
payload: Path del archivo local o referencia ID. - •
status: 'PENDING'
- •
- •Sync Worker:
- •Detecta
online. - •Lee
sys_outbox. - •Sube el archivo al endpoint remoto (S3/API).
- •Actualiza
statusa 'COMPLETED'. - •Elimina copia local si la política de retención lo dicta.
- •Detecta
Recuperación (Restore)
- •Importar: Leer archivo
.aex. - •Descifrar: Solicitar passphrase al usuario -> Derivar Key -> Descifrar AES-GCM.
- •Validar Header: Verificar "Magic Bytes" y versión compatible.
- •Reemplazar DB:
db.close()-> Sobreescribir OPFS -> Re-inicializar conexión.
Archivos Clave
- •
src/database/BackupManager.ts(Lógica de orquestación). - •
src/core/security/EncryptionService.ts(Implementación AES-GCM).