Retour au bureau

Dans le bureau : le téléphone

OsaDrop

Un code, un fichier, zéro serveur.

OsaDrop envoie des fichiers d'un appareil à l'autre avec un simple code à 6 caractères, un lien ou un QR code. Les fichiers vont directement d'un navigateur à l'autre : ils ne passent jamais par un serveur et ne sont stockés nulle part.

Ce que c'est
Transfert de fichiers · WebRTC
Rôle
Conception et développement
Période
5 → 11 octobre 2026
Statut
En ligne
Stack
WebRTCNext.jsReactTypeScriptSocket.ioNginxPM2
689lignes de code
64 Kopar morceau envoyé
1 Mode tampon maximum
0octet stocké sur le serveur

01Le point de départ

« Envoyer une photo de mon téléphone à un PC qui n'est pas le mien ne devrait pas demander un compte. »

AirDrop ne marche qu'entre appareils Apple. Les autres solutions passent par un cloud : on téléverse, on attend, on télécharge, et le fichier reste quelque part.

OsaDrop prend le chemin le plus court : les deux navigateurs se connectent directement en WebRTC. Le serveur ne sert qu'à les présenter l'un à l'autre, puis il n'entend plus parler du fichier.

02En images

À quoi ça ressemble.

osadrop.osalabs.fr
OsaDrop affiche un code à 6 caractères, un QR code et la liste des fichiers à envoyer
Le fichier est choisi : le code, le lien et le QR code sont prêts. On peut encore en ajouter d'autres.
osadrop.osalabs.fr
Accueil d'OsaDrop avec la mascotte
La nouvelle interface : la mascotte, et deux choix, envoyer ou recevoir.
OsaDrop sur mobile
Sur téléphone, le QR code ouvre la page déjà connectée.

03Comment ça marche

Sous le capot.

Deux phases : une courte présentation par le serveur, puis une conversation directe entre les deux appareils.

offre, ICEréponse, ICEDataChannel : le fichier Expéditeur navigateur Destinataire navigateur Serveur Socket.io · signalisation STUN trouver son IP
  1. Un salon à deux

    L'expéditeur choisit un ou plusieurs fichiers et reçoit un code, un lien et un QR code. Le serveur Socket.io crée un salon qui n'accepte que deux appareils.

  2. La signalisation

    Les deux navigateurs échangent leur offre, leur réponse SDP et leurs candidats ICE via le serveur. Un serveur STUN les aide à se trouver.

  3. Le canal direct

    Un DataChannel WebRTC s'ouvre entre eux, chiffré par défaut. Le serveur n'est plus utilisé.

  4. Envoi par morceaux

    Le fichier est découpé en morceaux de 64 Ko. Si plus de 1 Mo attend dans le tampon, l'envoi fait une pause jusqu'à ce qu'il se vide.

  5. Reconstitution

    Le destinataire assemble les morceaux, suit la progression, puis le fichier se télécharge tout seul.

✦À toi de jouer

Regarde un fichier voyager

Une simulation du vrai algorithme : le fichier part en morceaux de 64 Ko, et l'envoi s'arrête dès que le tampon dépasse 1 Mo. Décoche le contrôle de débit pour voir ce qui se passait avant le correctif.

!Les défis

Ce qui a résisté.

Des closures React périmées

ProblèmeLes gestionnaires Socket.io gardaient une ancienne valeur du code de salon : les messages partaient dans le vide.

SolutionLes valeurs utilisées par les callbacks passent par des refs React, toujours à jour.

Le tampon qui déborde

ProblèmeEnvoyer un gros fichier d'un coup saturait la file du DataChannel et coupait le transfert.

SolutionContrôle de débit avec bufferedAmount et l'événement bufferedamountlow : on n'envoie que quand il y a de la place.

Des états qui se croisent

ProblèmeL'interface annonçait « connecté » avant que le canal soit vraiment ouvert.

SolutionL'interface ne suit plus que l'état réel du canal (readyState), avec un délai de garde en cas de silence.

⏱Journal de bord

Comment c'est arrivé.

  1. Première implémentation WebRTC

    Salon, signalisation et DataChannel.

  2. Quatre correctifs en 20 minutes

    Closures périmées, courses entre états, débordement de la file.

  3. Transfert robuste

    Délai de garde sur le flux et scanner de QR code.

  4. Pont OsaNotch

    Une page qui expose le même moteur à l'app macOS.

  5. Documentation

    README complet avec fonctionnement, déploiement et limites.

  6. Nouvelle interface

    Mascotte vivante, plusieurs fichiers à la fois, lien de partage et QR code qui ouvre la page déjà connectée.

  7. Les mêmes codes partout

    OsaNotch utilise aussi les codes à 6 caractères : un envoi depuis le site arrive dans le notch.

→Et ensuite

La suite du projet.

  • Ajouter un serveur TURN pour les réseaux qui bloquent les connexions directes.
  • Écrire le fichier en flux sur le disque pour ne plus dépendre de la mémoire du destinataire.
  • Reprendre un transfert interrompu sans tout renvoyer.

Astuce : les flèches ← → de ton clavier passent d'un projet à l'autre.