Saltar al contenido principal

Módulo: Desktop

La aplicación de escritorio es la consola de administración para organizaciones que actúan como Emisores (emisores de credenciales) y Solicitantes (verificadores de credenciales).

Visión General

PropiedadValor
Identificadornetwork.almena.desktop.dev
FrameworkTauri v2 + React 19
Versión2026.3.5-alpha
Tamaño de ventana1440×900 (mín 1024×768)
Repositorioalmena-network/desktop

Estructura del Código

desktop/
├── src/ # Frontend React
│ ├── main.tsx # Punto de entrada
│ ├── App.tsx # Navegación y enrutamiento
│ ├── App.css # Tokens de diseño (glassmorphism)
│ ├── components/
│ │ ├── AppHeader.tsx # Barra superior con estado del daemon
│ │ ├── DaemonStatusButton.tsx # Control iniciar/detener daemon
│ │ ├── Dock.tsx # Navegación inferior con iconos SVG
│ │ └── Footer.tsx # Versión y enlace a GitHub
│ ├── pages/
│ │ ├── Login.tsx # Autenticación por código QR
│ │ ├── Network.tsx # Mapa mundial + lista de peers
│ │ ├── Dashboard.tsx # Resumen (esqueleto)
│ │ └── Settings.tsx # Placeholder
│ └── i18n/ # Traducciones inglés y español

├── src-tauri/ # Backend Rust
│ ├── src/
│ │ ├── main.rs # Punto de entrada Tauri
│ │ ├── lib.rs # Comandos Tauri
│ │ ├── grpc.rs # Cliente gRPC al daemon
│ │ └── daemon.rs # Gestión del proceso daemon
│ ├── proto/ # Archivos proto (copiados del daemon)
│ ├── tauri.conf.json # Configuración de la app
│ └── Cargo.toml # Dependencias Rust

├── package.json # Dependencias Node
├── vite.config.ts # Configuración Vite
└── Taskfile.yml # Orquestación de tareas

Funcionalidades Implementadas

Página de Login

  • Código QR que rota cada 30 segundos con un nuevo desafío
  • Payload del QR: almena:login:{timestamp}:{UUID}
  • Botón de omitir para desarrollo/pruebas
  • Soporte i18n (inglés/español)

Explorador de Red

  • Mapa mundial interactivo (react-simple-maps) centrado en el nodo local
  • Marcadores de peers con estado de conexión (verde = conectado, gris = desconectado)
  • Lista de peers mostrando: Peer ID truncado, tipo LAN/Internet, cantidad de direcciones
  • Datos en tiempo real de los RPCs ListPeers y GetGeolocation del daemon

Control del Daemon

  • Botón de estado en el header: rojo (detenido), verde (ejecutándose), amarillo (verificando)
  • Click para iniciar/detener el proceso daemon
  • Lógica de reintento: 5 intentos con retrasos de 500ms al iniciar

Internacionalización

  • Idiomas soportados: Inglés (en), Español (es)
  • Auto-detecta la preferencia de idioma del SO
  • Claves de recursos organizadas por dominio: app.*, nav.*, login.*, daemon.*, network.*

Comandos Tauri

Comandos expuestos al frontend React vía invoke():

ComandoRetornaDescripción
start_daemon()Result<String>Iniciar el proceso daemon
stop_daemon()Result<String>Detener el proceso daemon
list_peers()Result<Vec<PeerInfoJson>>Obtener peers del daemon
get_geolocation()Result<GeolocationJson>Obtener geolocalización del nodo

Integración gRPC

El backend Rust (src-tauri/src/grpc.rs) actúa como puente entre el frontend React y el daemon:

  1. React llama invoke("list_peers") vía IPC de Tauri
  2. El handler Rust conecta al daemon en DAEMON_GRPC_URL (por defecto: http://[::1]:50051)
  3. La respuesta gRPC se convierte a structs serializables a JSON
  4. La respuesta JSON se retorna a React

Gestión del Proceso Daemon

La app de escritorio gestiona el ciclo de vida del daemon de forma diferente en desarrollo vs producción:

ModoIniciarDetener
DesarrolloLanza binario desde ALMENAD_DIRMata proceso por PID
macOSlaunchctl load ...plistlaunchctl unload ...plist
Linuxsystemctl --user start almenadsystemctl --user stop almenad
Windowssc start AlmenaDsc stop AlmenaD

Desarrollo

# Instalar dependencias
task install

# Ejecutar en modo desarrollo (inicia Vite + Tauri)
task dev

# Verificación de tipos
task check

# Compilar para producción
task build

# Previsualizar frontend compilado
task preview

Variables de Entorno

VariablePor defectoDescripción
DAEMON_GRPC_URLhttp://[::1]:50051Endpoint gRPC del daemon
ALMENAD_DIR../../daemon/target/debugRuta al binario del daemon (modo desarrollo)

Flujo de Proto

Después de cambios en el proto del daemon:

task proto:copy     # Copiar proto del daemon
task proto:client # Recompilar cliente gRPC

Implementación Pendiente

  • Dashboard — Actualmente un esqueleto con grid vacío
  • Configuración — Página placeholder
  • Flujos de emisión de credenciales
  • Manejo de solicitudes de presentación
  • UI de gestión de organizaciones