- Se está desarrollando una función de soporte para Exchange en Thunderbird usando el lenguaje Rust
- En la próxima versión ESR (Extended Support) prevista para julio, primero se dará soporte solo al correo electrónico, y las funciones de calendario y libreta de direcciones llegarán después
- Brendan Abolivier, Ikey Doherty y Sean Burke están trabajando en esta tarea
Razones para elegir el lenguaje Rust
- Thunderbird es un proyecto antiguo y tiene mucho código legado en C++
- Para desarrollar nuevas funciones, se necesita un lenguaje potente y con buena mantenibilidad a largo plazo
- Rust ofrece ventajas como seguridad de memoria, rendimiento, modularidad y ecosistema
- La infraestructura de CI que comparte con Firefox ya soporta Rust
- A través de XPCOM es posible hacer llamadas entre Rust, C++ y JavaScript
- Se pueden aprovechar las sólidas herramientas de Rust para mejorar una arquitectura antigua
- Rust soporta varias plataformas, por lo que también puede reutilizarse en otros proyectos como Thunderbird para Android/K-9 Mail
Dificultades que enfrentaron
- En el código existente hay muchos patrones asíncronos que no encajan bien con Rust
- En las bases de código de Firefox y Thunderbird hay muchas funciones sin bindings de Rust
- El sistema de build de Thunderbird trae el código de Firefox como un subtree, lo que dificultó integrar código Rust
- Como no se pueden anidar workspaces de Cargo, lo resolvieron modificando la herramienta de build
mach
- XPCOM fue diseñado originalmente para C++, por lo que usarlo desde Rust requiere mucho código boilerplate
- Lo resolvieron implementando la lógica específica de cada protocolo en Rust y creando clases puente en C++ para integrarlas con el código existente
Implementación del soporte para Exchange con Rust
- La API EWS (Exchange Web Services) se comunica por HTTP y usa solicitudes y respuestas en formato XML
- Para enviar solicitudes HTTP usan el componente de red necko de Firefox, pero como está expuesto a través de XPCOM resulta incómodo de usar
- Crearon el crate
xpcom_async para convertir operaciones asíncronas de XPCOM a la sintaxis async/await de Rust
- Crearon el crate
moz_http para ofrecer una API de cliente HTTP al estilo de reqwest
- Intentaron usar crates existentes para procesar solicitudes/respuestas XML, pero no cumplían con los requisitos de EWS
- Crearon el crate
xml_struct para ofrecer un mapeo intuitivo entre estructuras de datos de Rust y XML
- Crearon el crate
ews para proporcionar definiciones de tipos para EWS y una API de serialización/deserialización XML basada en xml_struct y serde
Planes a futuro
- Están ampliando las pruebas automatizadas antes de avanzar con el desarrollo de las siguientes funciones importantes
- Además de pruebas unitarias, están realizando pruebas de integración con un servidor EWS simulado
- Están trabajando en mejorar el manejo de errores
- Como el comportamiento de error de EWS no está bien documentado, hace falta manejarlo en distintos niveles, desde el protocolo hasta los casos que requieren intervención del usuario
- Están ampliando el soporte del protocolo EWS y trabajando en su integración con la UI de Thunderbird
- Recientemente completaron funciones como agregar cuentas EWS, sincronizar la jerarquía de carpetas desde el servidor remoto y mostrar carpetas en la UI
- Lo siguiente será obtener la lista de mensajes desde el servidor remoto y generalizar la función de correo saliente de Thunderbird
- Planean documentar todo el trabajo para asegurar la mantenibilidad futura
- También están documentando la arquitectura actual de los protocolos de correo en Thunderbird y la dirección de sus mejoras
Opinión de GN⁺
- La introducción de Rust en Thunderbird para modernizar una arquitectura antigua parece un cambio muy positivo. Están haciendo diversos esfuerzos para aprovechar las ventajas de Rust mientras mantienen la compatibilidad con la base de código existente.
- Los crates creados durante el proceso de desarrollo, como
xpcom_async, moz_http, xml_struct y ews, podrían ser útiles también en otros proyectos además de Thunderbird.
- Sin embargo, la arquitectura antigua de Thunderbird y un sistema de build dependiente de la base de código de Firefox podrían seguir siendo obstáculos para la adopción de Rust. A largo plazo, también parece necesario trabajar para resolver esos problemas.
- Dado que EWS es un servicio de correo muy usado en empresas e instituciones educativas, que Thunderbird lo soporte podría ayudar mucho a ampliar su base de usuarios. Aun así, como EWS es un protocolo propietario de Microsoft, implementarlo en un proyecto de código abierto puede implicar dificultades.
- En general, da la impresión de que el proyecto Thunderbird está aprovechando la adopción de Rust para impulsar activamente la modernización de su arquitectura y la expansión de funciones. Como uno de los principales clientes de correo de código abierto, el avance de Thunderbird beneficiará mucho a sus usuarios.
1 comentarios
Comentarios en Hacker News