Includes React PWA frontend, WebSocket signaling server, shared types, K8s manifests, Gitea CI/CD workflow, nginx config, and Dockerfiles. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.5 KiB
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.
{
"type": "hello",
"joinCode": "x7k" // optionnel
}
create-public-room
Demande la création d'une room publique avec un code court.
{ "type": "create-public-room" }
signal
Relaie un message WebRTC (offer, answer, ICE candidate) vers un autre pair de la même room.
{
"type": "signal",
"to": "b2",
"data": { /* SDP ou ICE */ }
}
leave
Le client annonce qu'il quitte (optionnel, sinon détecté par fermeture WebSocket).
{ "type": "leave" }
Messages serveur → client
welcome
Réponse au hello. Fournit l'identité du client.
{
"type": "welcome",
"peerId": "a1",
"displayName": "Renard Bleu",
"roomId": "lan:abc123",
"peers": [
{ "peerId": "b2", "displayName": "Tigre Rouge" }
]
}
public-room-created
Réponse à create-public-room.
{
"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.
{
"type": "peer-joined",
"peerId": "c3",
"displayName": "Ours Vert"
}
peer-left
Un pair a quitté.
{
"type": "peer-left",
"peerId": "c3"
}
signal
Relai d'un message WebRTC reçu d'un autre pair.
{
"type": "signal",
"from": "a1",
"data": { /* SDP ou ICE */ }
}
error
Erreur générique.
{
"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
signaln'est relayé que sitoest 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(exclutiloLIO01pour 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.