🧩 Caso 20: 🍎 Swift → 🌉 n8n → 🎯 Dart (Shelf) + 🔥 Firestore emulator#
-FFCA28?logo=firebase&logoColor=black)
Stack mobile-backend con lenguajes server-side: emisor Swift (en Linux) y receptor Dart con Shelf, persistiendo en el emulador de Firestore de la Firebase Emulator Suite (local, sin cloud).
🏗️ Arquitectura del Flujo#
- 📤 Origen —
origin/Sources/Publisher/main.swift: emisor Swift que reenvía los posts vencidos al webhook de n8n conURLSession. - 🌉 Puente — n8n: guardrails canónicos (fingerprint → circuit breaker → idempotencia → HTTP con reintentos → DLQ).
- 📥 Destino —
dest/bin/server.dart: receptor Dart/Shelf (compilado AOT a binario nativo) que cumple el contrato REST. - 📁 Persistencia — Firestore emulator: el receptor hace
PATCH/GETa la API REST v1 del emulador (colecciónsocial_posts, documentos confieldstipados).
Nota
El emulador de Firestore (Firebase Emulator Suite) corre local, sin proyecto real ni credenciales cloud. La imagen pre-descarga el JAR del emulador en el build para arrancar sin red.
🚀 Cómo levantarlo#
bash
docker-compose --profile case20 up -d # emulador Firestore + receptor Dart| Servicio | Rol | Puerto host |
|---|---|---|
firebase-emu-20 | Emulador de Firestore | interno (:8200) |
dest-dart-20 | Dart/Shelf + dashboard | 8100 |
- Dashboard del caso: http://localhost:8100
- Probar desde el dashboard maestro: http://localhost:8080 → tarjeta CASE-20.
🎯 Objetivos didácticos#
- Swift y Dart server-side: dos lenguajes "mobile-first" usados como backend compilado.
- Firebase Emulator Suite: desarrollo local contra Firestore sin tocar la nube.
- API REST de Firestore: documentos con
fieldstipados (stringValue,integerValue).
⚠️ Consideraciones (modelo del laboratorio)#
- Puerto
8100=8080 + 20(regla canónica, ver docs/PORTS.md). - Bind a
127.0.0.1; el receptor validaid/text(→ HTTP 422). - El emulador (JVM) es el servicio pesado del caso; los datos no persisten entre reinicios.
✅ Estado#
Implementado y verificado (build + boot + health). Parte del Lote 3 del roadmap v5.0 → v4.7.