- Une prise en charge d’Exchange est en cours de développement pour Thunderbird en utilisant le langage Rust
- La prochaine version ESR (Extended Support), prévue pour juillet, prendra d’abord en charge uniquement les e-mails ; les fonctions calendrier et carnet d’adresses arriveront plus tard
- Brendan Abolivier, Ikey Doherty et Sean Burke travaillent sur ce chantier
Pourquoi avoir choisi Rust
- Thunderbird est un ancien projet avec beaucoup de vieux code C++
- Le développement de nouvelles fonctionnalités nécessite un langage puissant offrant aussi une bonne maintenabilité à long terme
- Rust présente des avantages en matière de sécurité mémoire, de performance, de modularité et d’écosystème
- L’infrastructure CI partagée avec Firefox prend déjà en charge Rust
- XPCOM permet des appels entre Rust, C++ et JavaScript
- Les outils puissants de Rust peuvent aider à améliorer une architecture vieillissante
- Rust prend en charge diverses plateformes, ce qui permet aussi une réutilisation dans d’autres projets comme Thunderbird pour Android / K-9 Mail
Difficultés rencontrées
- Le code existant contient de nombreux patterns asynchrones qui s’accordent mal avec Rust
- Les codebases de Firefox et Thunderbird comportent beaucoup de fonctionnalités sans bindings Rust
- Le système de build de Thunderbird importe le code de Firefox sous forme de sous-arbre, ce qui compliquait l’intégration du code Rust
- Comme il n’est pas possible d’imbriquer des workspaces Cargo, le problème a été résolu en modifiant l’outil de build
mach
- XPCOM a été conçu à l’origine pour le C++, et son usage depuis Rust demande beaucoup de code boilerplate
- La solution retenue consiste à implémenter en Rust la logique propre à chaque protocole, puis à créer en C++ des classes passerelles pour l’intégrer au code existant
Implémentation de la prise en charge d’Exchange avec Rust
- L’API EWS (Exchange Web Services) communique en HTTP et utilise des requêtes et réponses au format XML
- Pour envoyer les requêtes HTTP, le projet utilise le composant réseau
necko de Firefox, mais son exposition via XPCOM le rend peu pratique à utiliser
- Le crate
xpcom_async a été créé pour convertir les opérations asynchrones de XPCOM vers la syntaxe async/await de Rust
- Le crate
moz_http a été créé pour fournir une API de client HTTP de style reqwest
- Les développeurs ont tenté d’utiliser des crates existants pour traiter les requêtes/réponses XML, mais ils ne satisfaisaient pas les exigences d’EWS
- Le crate
xml_struct a été créé afin de fournir un mapping intuitif entre les structures de données Rust et le XML
- Le crate
ews a été créé afin de fournir les définitions de types pour EWS ainsi qu’une API de sérialisation/désérialisation XML basée sur xml_struct et serde
Prochaines étapes
- L’équipe renforce actuellement les tests automatisés avant le développement des prochaines fonctionnalités majeures
- En plus des tests unitaires, des tests d’intégration sont en cours avec un serveur EWS simulé
- Un travail d’amélioration de la gestion des erreurs est en cours
- Le comportement d’erreur d’EWS étant mal documenté, il faut le traiter à plusieurs niveaux, du protocole jusqu’aux cas nécessitant une intervention utilisateur
- L’extension de la prise en charge du protocole EWS et son intégration à l’interface de Thunderbird se poursuivent
- Des fonctions comme l’ajout récent de comptes EWS, la synchronisation de la hiérarchie des dossiers depuis le serveur distant et l’affichage des dossiers dans l’interface ont déjà été implémentées
- Les prochaines étapes sont la récupération de la liste des messages depuis le serveur distant et la généralisation de la prise en charge de l’envoi d’e-mails dans Thunderbird
- Toute cette évolution sera documentée afin d’assurer la maintenabilité à venir
- Une documentation sur l’architecture existante des protocoles mail de Thunderbird et sur les pistes d’amélioration est également en cours
L’avis de GN⁺
- L’introduction de Rust dans Thunderbird pour moderniser une architecture ancienne semble être une évolution très positive. L’équipe multiplie les efforts pour tirer parti des avantages de Rust tout en préservant la compatibilité avec la codebase existante.
- Les crates créés pendant le développement, comme
xpcom_async, moz_http, xml_struct et ews, pourraient aussi se révéler utiles dans d’autres projets au-delà de Thunderbird.
- Cela dit, l’architecture vieillissante de Thunderbird et son système de build dépendant de la codebase de Firefox pourraient continuer à freiner l’adoption de Rust. À long terme, il faudra aussi travailler à résoudre ces problèmes.
- EWS étant un service de messagerie largement utilisé dans les entreprises et les établissements d’enseignement, sa prise en charge dans Thunderbird pourrait considérablement élargir la base d’utilisateurs. Mais comme EWS est un protocole propriétaire de Microsoft, son implémentation dans un projet open source peut s’avérer difficile.
- Dans l’ensemble, le projet Thunderbird semble profiter de l’adoption de Rust pour accélérer la modernisation de son architecture et l’extension de ses fonctionnalités. En tant que client e-mail open source de référence, les progrès de Thunderbird bénéficieront grandement à ses utilisateurs.
1 commentaires
Avis Hacker News