En local, tout marchait. En production sur Vercel, l’indicateur de connexion passait au vert, « État : Connecté », et puis plus rien. L’organisateur créait une partie, un joueur la rejoignait, et l’écran de l’organisateur restait vide. Pas d’erreur. Pas de message. Une connexion ouverte sur du silence.
Ce que je croyais
Qu’il s’agissait d’un problème de réseau ou de sécurité. La production est derrière un domaine, avec une politique de sécurité de contenu, et les WebSocket ont besoin qu’on leur ouvre la porte : les protocoles ws:// et wss:// doivent être autorisés. J’ai vérifié, corrigé, redéployé. Toujours vert, toujours vide.
Ensuite j’ai soupçonné les variables d’environnement, parce qu’elles sont différentes entre le poste et le serveur. J’ai ajouté des .trim() partout, au cas où. Redéployé. Vert, vide.
Ce que c’était
PartyKit organise les connexions par « parties », c’est-à-dire par pièces : chaque type de pièce a un nom, et le client doit dire à laquelle il veut parler. Le constructeur de la connexion acceptait un paramètre party, et je ne le passais pas. En local, la valeur par défaut tombait sur la bonne pièce. En production, elle tombait sur une pièce vide, qui acceptait poliment la connexion et n’avait personne pour écouter.
// avant : connecté à une pièce qui n'existe pas
new PartySocket({ host, room: code });
// après : connecté à la pièce qui gère le jeu
new PartySocket({ host, room: code, party: 'game' });
Une ligne. Le correctif est daté du 13 février, dans le CHANGELOG, avec la mention « fix critique ». J’aurais pu écrire « fix humiliant ».
Ce que j’en retiens
Le signal qui m’a trompé, c’est le voyant vert. « Connecté » voulait dire que la poignée de main WebSocket avait réussi, pas que quelqu’un écoutait de l’autre côté. Un indicateur qui rassure sans rien garantir est pire qu’aucun indicateur : il oriente la recherche vers tout ce qui n’est pas lui.
L’outil d’IA avait écrit le client et le serveur, cohérents entre eux, avec cette valeur par défaut qui marchait sur ma machine. Il n’y avait aucune raison pour qu’il remarque ce que la production allait changer, et je ne le lui avais pas demandé. La question utile, que je pose maintenant avant chaque déploiement, tient en une phrase : qu’est-ce qui est différent là-bas, et où est-ce que ça entre dans le code ?
Un voyant vert dit que la porte est ouverte. Il ne dit pas qu’il y a quelqu’un derrière.
Recevoir le journal
Une entrée par semaine environ. Ce que je construis, ce qui casse, ce que j'apprends. Pas de promotion, désinscription en un clic.
Vous pouvez aussi suivre le flux RSS.