Easy-Share
Alternative à AirDrop, pour partager des fichiers et/ou du texte entre tous les appareils (PC, Mac, iPhone, Android, tablettes) via le réseau local sans aucune donnée dans le cloud.
Pourquoi recoder AirDrop ?
En novembre 2025, Google a annoncé que Quick Share sera compatible avec AirDrop !
Le souci, c'est que cette compatibilité ne concerne que les appareils Android récents, et ce n'est malheureusement pas le cas pour les utilisateurs Windows (comme moi) qui possèdent un iPhone.
Il m'arrive très souvent de devoir transférer rapidement des fichiers ou du texte entre mon iPhone et mon PC Windows, et je me suis retrouvé à chercher une solution simple, rapide et universelle. C'est ainsi qu'est né Easy-Share.
Mon idée était de créer le moyen le plus simple possible de partager des fichiers et/ou du texte entre mes appareils sans casser mon flow de travail. J'ai donc décidé de recoder AirDrop à ma manière, en utilisant des technologies web modernes et universelles.
Comment ça fonctionne ?
Easy-Share est une application de bureau qui lance un serveur local sur l'ordinateur de l'hôte. Les appareils distants (smartphones, tablettes, autres ordinateurs) se connectent à ce serveur via un navigateur web. Le partage de fichiers et de texte s'effectue ensuite en temps réel grâce à une combinaison de WebSockets et de flux HTTP.
Pourquoi Electron alors que Tauri existe ?
Parce que je n'avais pas envie de tout réécrire en Rust... En réalité, j'ai commencé dans un premier temps par coder le serveur Express en Node.js, puis j'ai ajouté une interface web pour tester le partage de fichiers. Ensuite, j'ai voulu transformer ce serveur en application de bureau pour que ce soit plus simple à utiliser. Electron était donc le choix le plus logique.
Ici, Node.js était aussi le choix le plus simple car cela m'a permis assez facilement de gérer les flux de fichiers et les WebSockets.
Qu'est-ce qu'un WebSocket ?
J'en parle depuis le début, et pour être honnête, je ne savais pas ce que c'était avant de commencer ce projet. Un WebSocket est un protocole de communication qui permet d'établir une connexion bidirectionnelle entre un client et un serveur. Contrairement au protocole HTTP classique, qui est basé sur des requêtes et des réponses, les WebSockets permettent aux deux parties d'envoyer des messages à tout moment, sans avoir besoin d'attendre une réponse.
C'est très pratique pour notre cas, car cela nous permet de faire une connexion persistante entre l'application de bureau et les appareils distants, ce qui est idéal pour le partage de fichiers et de texte en temps réel.
Comment les appareils se connectent ?
Pour que les appareils mobiles puissent se connecter, l'application doit exposer l'adresse IP du serveur sur le réseau local. Un souci que j'ai eu au début, c'est que mon ordinateur avait plusieurs cartes réseau (Wi-Fi, Ethernet, VPN, Docker, etc.) et que je ne savais pas laquelle utiliser pour exposer le serveur.
J'ai mis au point un algorithme qui semble intelligent pour déterminer la meilleure adresse IP à utiliser :
- Il élimine les cartes virtuelles ou VPN (Docker, WSL, loopbacks, etc.).
- Il donne la priorité aux adaptateurs physiques (Wi-Fi et Ethernet).
- Il exclut les adresses locales non routables (comme
169.254.x.xou celles se terminant par.1).
Une fois la meilleure adresse IP identifiée, un QR code est généré à l'écran. Il suffit de le scanner avec un smartphone pour ouvrir directement l'interface web de partage.
Communication temps réel en WebSockets
Les échanges de messages textuels et la détection de présence des appareils connectés s'appuient sur le protocole WebSocket (via la bibliothèque ws).
À chaque connexion, le serveur et le client établissent un canal de communication bidirectionnel qui reste ouvert tant que l'appareil est actif.
Partage de gros fichiers via flux HTTP
L'une des contraintes des WebSockets est qu'ils ne sont pas optimisés pour le transfert de fichiers très lourds, car cela peut bloquer le fil d'exécution JavaScript et saturer la mémoire vive.
Pour résoudre ce problème, j'ai décidé d'utiliser des flux HTTP pour le transfert de fichiers. Je ne vais pas rentrer dans les détails, mais lorsque le système détecte qu'un fichier est trop lourd, il bascule automatiquement sur un flux HTTP pour envoyer ou recevoir le fichier.
Fermeture automatique du serveur
Un piège dans lequel il ne faut pas tomber (je ne parle pas du tout d'expérience personnelle) est de laisser le serveur tourner en arrière-plan après la fermeture de l'application. Cela peut arriver si l'application est fermée brutalement ou si le processus Node.js n'est pas correctement arrêté.
J'ai donc mis en place un système d'extinction automatique du serveur. Si l'hôte ferme sa connexion WebSocket, le serveur s'arrête de lui-même.
Conclusion
Je n'ai pas le niveau de Google pour rétro-ingéniérer AirDrop (même si ça peut être une idée de futur projet, pourquoi pas ?), mais je suis assez fier de ce que j'ai pu créer avec Easy-Share. Je l'utilise quand j'ai besoin de partager des fichiers et du texte entre mon iPhone et mon PC Windows, et ça fonctionne plutôt bien.