FG crée une invitation, montre le QR code, le téléphone l'ouvre… et reste sur « Connexion au
réseau Jah… ne décroche pas le téléphone ! ». Pas d'erreur, pas de page blanche : une attente
polie qui ne finit jamais. Le serveur, lui, va très bien : /readyz répond 4.0.5, aucun 5xx.
Ce que disaient les journaux
Le hub ne journalise ni contenu ni adresse, seulement une empreinte d'IP. Ça suffit pour suivre un appareil :
18:07:49 visiteur A GET / → les 51 modules du démarrage, tous 200
18:08:30 visiteur A GET / → les 51 modules, tous 304
18:09:19 visiteur A GET / → les 51 modules, tous 200
… et jamais GET /api/meta, le premier appel de boot.mjs
Trois chargements complets, aucun appel d'API. Le code arrive, mais il ne s'exécute pas. Dans un navigateur moderne, la même page démarre en une seconde. Le problème dépend donc du moteur.
Le coupable : quatre caractères
Dans un graphe de modules ES, une seule erreur au chargement suffit à tout faire tomber.
/shared/markup.mjs, qui découpe les messages en emotes, liens et mentions, construisait au
chargement cette expression :
'((?<![\\w.@])@[a-z0-9._-]{2,32}(?:@jah)?)', // mention, sauf collée à un mot
(?<! est un lookbehind : « pas précédé de ». Safari ne le comprend que depuis la 16.4 (mars
2023). Un iPhone 7 est bloqué en iOS 15. Là, new RegExp(...) lève invalid group specifier name, le module tombe, boot.mjs avec lui, et l'écran d'attente reste affiché.
La réparation
- Test rouge d'abord : charger le module avec un
RegExpqui refuse les lookbehinds, comme le vieux Safari. Il échoue avec exactement le message de Safari. - Même découpage, sans lookbehind : le caractère qui précède est vérifié dans la boucle, avec
les mêmes drapeaux. Avec le drapeau
iu,\wattrape aussiſet le signe KelvinK; la vérification garde ces drapeaux pour rester identique. - Preuve d'équivalence : 200 000 textes aléatoires, ancien contre nouveau découpage, 800 000 comparaisons, 0 écart.
- Le cliquet : le lint refuse désormais tout lookbehind dans le code servi au client. Ce piège-là ne reviendra pas sans faire rougir la CI.
Ce qu'on en garde
- Un écran d'attente doit savoir qu'il attend trop. Un garde-fou est parti dans la même version : un petit module sans aucun import, chargé avant le démarrage, donc indépendant de lui. Si l'attente dure plus de 12 s ou si un module tombe, il propose de recharger ou de mettre le téléphone à jour au lieu d'attendre sans fin.
- Les journaux sans contenu suffisent à diagnostiquer. Une empreinte d'IP et une liste de chemins ont montré où le démarrage s'arrêtait, sans rien savoir de qui était derrière.
- Le serveur vert ne dit rien du client.
/readyzà 200 pendant que des habitants restent à la porte : c'est la deuxième fois en deux jours (la première, c'était le mode maintenance).
Le reste de la journée
La vague B du fond de tâches est partie avec ce correctif. Le ramasse-miettes des fichiers efface
enfin pour de vrai, après trois jours en mode « à blanc » (depuis le 28/09, 2b3c001). Les erreurs de signalisation d'appel
laissent maintenant une trace au lieu d'être avalées. Le pont Telegram est branché côté admin.
Version publiée : 4.0.6.