Garder le chat actif quand un téléphone se met en veille
L'agent Mythex peut travailler pendant plusieurs minutes sur une seule demande, et vous pouvez très bien suivre cela depuis un téléphone, qui se verrouille, change d'application et change de réseau pendant ce temps. Deux bugs faisaient mal tourner les choses. Dans le premier, le chat traitait chaque signal « la page est de nouveau visible » comme la preuve que sa connexion était morte, et tournait en boucle jusqu'à rester bloqué sur « Connecting… ». Dans l'autre, un téléphone endormi pendant la première réponse d'un nouveau chat revenait avec seulement les premiers morceaux, jusqu'à un rafraîchissement manuel. Les deux sont corrigés.
Comment le chat suit un tour en cours
Pendant que l'agent travaille, le chat garde ouvert un flux depuis nos serveurs : chaque étape (une réflexion, un appel d'outil, un morceau de réponse) arrive sous forme d'événement. Si le flux se coupe, le chat se reconnecte et le serveur rejoue les événements récents depuis un tampon qui conserve les 120 dernières secondes. À la fin du tour, le chat demande aussi au serveur l'historique sauvegardé et réconcilie ce qu'il a affiché avec ce qui a été stocké. Cette dernière étape rattrape tout ce que le flux a pu manquer.
Pour distinguer une connexion vivante d'une connexion morte quand il ne se passe rien, le serveur envoie un petit « ping » toutes les 15 secondes.
Bug 1 : le réveil tuait un flux sain
Les navigateurs signalent à une page qu'elle redevient visible : après un changement d'onglet, après le déverrouillage de l'écran. Nous utilisions ce signal pour vérifier la connexion, et en pratique pour interrompre le flux et le rouvrir, en supposant qu'il était mort pendant que la page était cachée.
Sur les téléphones et dans les navigateurs intégrés, ces événements se déclenchent bien plus souvent que les flux ne meurent : à chaque changement d'onglet, à chaque déverrouillage, et, dans certains navigateurs intégrés, toutes les deux secondes environ. Chacun interrompait un flux parfaitement sain. Le chat se reconnectait, rejouait, était interrompu à nouveau, et finissait sur « Connecting… ». Puis il affichait que le tour était terminé alors que l'agent travaillait encore.
La correction : juger le flux à son activité
Le chat enregistre désormais la dernière fois que le flux de chaque projet a reçu quoi que ce soit, aussi bien des événements que les pings de 15 secondes. Un signal « de nouveau visible » n'interrompt un flux que s'il est resté silencieux pendant 25 secondes : plus que l'intervalle de ping plus un délai réseau raisonnable, de sorte qu'un flux vivant ne tombe jamais dans ce cas. Des tests vérifient qu'un ping compte comme signe de vie, et qu'un flux qui vient de répondre par un ping n'est pas considéré comme mort.
La règle que nous en avons tirée : la visibilité d'une page dit quelque chose de la page, pas de la connexion réseau. Interrogez la connexion.
Bug 2 : une moitié de réponse après le réveil du téléphone
Ce bug, nous pouvions le reproduire à chaque fois dans le simulateur iOS :
- Démarrez un nouveau chat et envoyez une demande qui prend du temps.
- Laissez le téléphone se mettre en veille pendant la construction.
- Revenez après la fin du tour et l'expiration du tampon de rejeu de deux minutes.
Le chat affichait les premiers blocs de la réponse, marqués comme terminés, et restait ainsi jusqu'à un rafraîchissement de la page.
Pourquoi
Un nouveau chat n'a pas encore de fil, c'est-à-dire de conversation stockée, tant que le premier message n'en crée pas un. Cela se produit à l'intérieur de la fonction d'envoi, après que l'envoi avait déjà capturé l'étape de réconciliation, qui croyait encore qu'il n'y avait pas de fil. Donc, à la fin du premier tour d'un nouveau chat, la réconciliation ne voyait aucun fil et revenait discrètement sans rien demander.
Personne ne le remarquait généralement, car le flux avait déjà livré tout le tour. Mais un téléphone endormi pendant le tour et revenu après l'expiration du tampon de rejeu de 120 secondes ne pouvait pas récupérer les événements manquants depuis le flux, et la réconciliation censée combler le trou n'avait jamais été exécutée.
La correction
- L'envoi indique à la réconciliation à quel fil appartient le tour, si bien que le premier tour d'un nouveau chat est réconcilié comme tous les autres. Si vous avez ouvert un autre chat entre-temps, le résultat est écarté au lieu d'être affiché au mauvais endroit.
- Une réconciliation échouée est retentée. Un téléphone qui se réveille sur une mauvaise connexion peut trouver le tour terminé puis échouer à le récupérer. Cela est désormais mémorisé, et le chat réessaie lorsque l'onglet est de nouveau affiché ou que le réseau revient.
- « Worked for » est honnête. Chaque réponse indique combien de temps l'agent a travaillé. Si l'onglet n'a jamais reçu le message de fin de tour du serveur, il comblait ce vide avec sa propre horloge, qui partait de l'envoi jusqu'au réveil du téléphone, absence comprise. Cette durée est désormais marquée comme une estimation, et remplacée par la durée enregistrée dès que l'historique arrive.
Ce que nous en retenons
- Testez sur l'appareil que les gens utilisent réellement, de la façon dont ils l'utilisent. Les deux bugs se trouvaient dans l'écart entre « un flux qui fonctionne » et « un téléphone dans une poche ».
- Un repli qui ne s'exécute jamais n'est pas un repli. La réconciliation existait précisément pour ce cas, et elle le sautait en silence.
- Réessayez aussi la récupération. Le moment où un téléphone se réveille est souvent celui où sa connexion est au plus mal.
- N'affichez pas une supposition comme un fait. Une durée mesurée sur la mauvaise horloge est pire que pas de durée du tout ; indiquez-le ou remplacez-la.
Ce même travail a aussi clarifié quelques éléments que vous voyez pendant un tour : les étapes shell portent le nom de la commande qui fait le travail plutôt que cd, les captures d'écran dans le chat gardent le haut de la page à gauche et tiennent dans la colonne, et un nouveau projet reprend son nom généré sans rafraîchissement.
Si vous construisez votre propre app pour téléphone, nos guides sur comment créer une app web adaptée au mobile et applications natives ou web progressives présentent les bases. Pour en savoir plus sur le chat lui-même, voir les docs du chat.