# Protocole de signaling AnyDrop Protocole simple en JSON via WebSocket. Endpoint : `wss://ws.anydrop.arthurbarre.fr`. Tous les messages ont un champ `type`. Les types côté client et côté serveur sont définis dans `shared/protocol.ts`. ## Messages client → serveur ### `hello` Envoyé immédiatement après connexion. Si `joinCode` est présent, le client rejoint la room publique correspondante. Sinon il est placé dans la room LAN basée sur son IP publique. ```json { "type": "hello", "joinCode": "x7k" // optionnel } ``` ### `create-public-room` Demande la création d'une room publique avec un code court. ```json { "type": "create-public-room" } ``` ### `signal` Relaie un message WebRTC (offer, answer, ICE candidate) vers un autre pair de la même room. ```json { "type": "signal", "to": "b2", "data": { /* SDP ou ICE */ } } ``` ### `leave` Le client annonce qu'il quitte (optionnel, sinon détecté par fermeture WebSocket). ```json { "type": "leave" } ``` ## Messages serveur → client ### `welcome` Réponse au `hello`. Fournit l'identité du client. ```json { "type": "welcome", "peerId": "a1", "displayName": "Renard Bleu", "roomId": "lan:abc123", "peers": [ { "peerId": "b2", "displayName": "Tigre Rouge" } ] } ``` ### `public-room-created` Réponse à `create-public-room`. ```json { "type": "public-room-created", "code": "x7k", "url": "https://anydrop.arthurbarre.fr/x7k", "expiresAt": "2026-04-14T18:30:00Z" } ``` ### `peer-joined` Un nouveau pair rejoint la room. ```json { "type": "peer-joined", "peerId": "c3", "displayName": "Ours Vert" } ``` ### `peer-left` Un pair a quitté. ```json { "type": "peer-left", "peerId": "c3" } ``` ### `signal` Relai d'un message WebRTC reçu d'un autre pair. ```json { "type": "signal", "from": "a1", "data": { /* SDP ou ICE */ } } ``` ### `error` Erreur générique. ```json { "type": "error", "code": "room-not-found" | "room-expired" | "rate-limit", "message": "..." } ``` ## Règles serveur - Un client peut appartenir à **1 room LAN + 0 ou 1 room publique** simultanément. - Un message `signal` n'est relayé que si `to` est dans au moins une des rooms du sender. - Une room publique expire après **10 minutes sans nouveau message**. - Le code court est généré dans l'alphabet `abcdefghjkmnpqrstuvwxyz23456789` (exclut `iloLIO01` pour lisibilité). - Longueur par défaut : **3 caractères** ; si collision, essayer 5 fois puis passer à **4 caractères**. - Rate limit : 10 connexions/minute par IP, 100 messages/minute par connexion.