Reescribiendo la base: Por qué creamos una alternativa a LocalSend en Rust
Como usuarios asiduos de LocalSend y Snapdrop, optamos por construir xSend desde cero en Rust. Explora el salto generacional de rendimiento.
Sin lugar a duda, proyectos como LocalSend son fenomenales. Con una elegante interfaz, han salvado a muchos de los dolores de mover archivos entre macOS, Windows y Android.
Sin embargo, como usuarios exigentes (power users), cuando requerimos transferir carpetas inmensas, traspasar NAT y no gastar recursos de memoria, hallamos límites insalvables con la arquitectura basada en aplicaciones de alto nivel.
Decidimos derribarlo todo, reescribiendo la pila de red desde cero en Rust para crear xSend.
1. Cruzando el abismo de la recolección de basura (GC): Dart frente a Rust
LocalSend está hecho en Flutter/Dart. Pero en I/O de red de alta intensidad, el Recolector de Basura (GC) de Dart estanca la velocidad. La VM requiere mucha memoria RAM y hace pausas.
xSend es puro Rust. El modelo de Ownership aniquila el requerimiento de recolectar basura. El resultado es que xSend consume unos pocos megabytes y logra llevar al límite la tarjeta Gigabit sin fatigar la CPU.
2. Rompiendo las cadenas: Desde puro WebRTC a un Stack Nativo de Red
Otras apps (como Snapdrop) utilizan puro WebRTC. Pero una aplicación que viva exclusivamente en el navegador no permite ejecuciones en segundo plano y posee cuellos de botella por copia de memoria en sandbox.
Nuestro enfoque es ser nativo en todas partes, controlando el enrutamiento TCP y QUIC, consiguiendo velocidades 3 a 5 veces más altas que una página web y logrando reanudar bajo bloqueo de pantalla.
3. Fin de la pesadilla “Red Equivocada”: Auto-Route
Si has usado LocalSend en una empresa grande de VLANs, sabes que el protocolo mDNS se detiene abruptamente en el switch. Tienes que digitar la IP.
xSend incluye una arquitectura multi-tiers:
- Tier 1: TCP a nivel LAN.
- Tier 2: UDP Hole Punching vía QUIC en redes externas.
- Tier 3: Relé TURN encriptado.
Solo requieres escribir 6 dígitos y nuestro sistema probará todas las vías para establecer una transmisión ininterrumpida.
Epílogo: ¿Por qué Rust?
Para los aparatos nerviosos de transmisión necesitábamos velocidad a nivel de C/C++ pero con cero riesgos de debilidad de memoria (buffer overflow). Rust es inigualable en este sector y convierte el encriptado asíncrono en un juego de niños.