Garder le clavardage actif quand un téléphone se met en veille
L'agent de Mythex peut travailler pendant plusieurs minutes sur une seule demande, et vous pouvez très bien le suivre depuis un téléphone, qui se verrouille, passe d'une app à l'autre et change de réseau pendant ce temps. Deux bogues provoquaient des ratés. Dans le premier, le clavardage traitait chaque signal « la page est de nouveau visible » comme une preuve que sa connexion était morte, et bouclait jusqu'à rester sur « Connexion… ». Dans le second, un téléphone en veille pendant la première réponse d'un nouveau clavardage revenait avec seulement les premiers morceaux de cette réponse, jusqu'à un rafraîchissement manuel. Les deux sont corrigés.
Comment le clavardage suit un tour en cours
Pendant que l'agent travaille, le clavardage garde ouvert un flux depuis nos serveurs : chaque étape (une réflexion, un appel d'outil, un morceau de la réponse) arrive comme un événement. Si le flux se coupe, le clavardage se reconnecte, et le serveur rejoue les événements récents depuis une mémoire tampon qui conserve les 120 dernières secondes. Quand le tour se termine, le clavardage demande aussi au serveur l'historique enregistré et réconcilie ce qu'il affichait avec ce qui a été stocké. Cette dernière étape rattrape tout ce que le flux a manqué.
Pour distinguer une connexion vivante d'une connexion morte lorsque rien ne se passe, le serveur envoie un petit « ping » toutes les 15 secondes.
Bogue 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 rétablir, 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 clavardage se reconnectait, rejouait, était de nouveau interrompu, et finissait par rester sur « Connexion… ». Puis il affichait que le tour était terminé alors que l'agent travaillait encore.
La correction : juger le flux selon qu'il parle encore
Le clavardage enregistre maintenant le moment où le flux de chaque projet a reçu quoi que ce soit pour la dernière fois, événements et pings de 15 secondes compris. Un signal « visible à nouveau » n'interrompt un flux que s'il est resté silencieux pendant 25 secondes : plus que l'intervalle des pings plus un petit délai réseau, de sorte qu'un flux vivant n'est jamais concerné. 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 renseigne sur la page, et non sur la connexion réseau. Interrogez la connexion.
Bogue 2 : une moitié de réponse après le réveil du téléphone
Nous avons pu reproduire celui-ci à chaque fois dans le simulateur iOS :
- Démarrez un nouveau clavardage et envoyez une demande qui prend du temps.
- Laissez le téléphone se mettre en veille pendant la création.
- Revenez une fois le tour terminé et la mémoire tampon de rejeu de deux minutes expirée.
Le clavardage 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 clavardage n'a pas de fil, c'est-à-dire de conversation enregistré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 a déjà capturé l'étape de réconciliation, qui croyait encore qu'il n'y avait aucun fil. Ainsi, à la fin du premier tour d'un nouveau clavardage, la réconciliation ne voyait aucun fil et revenait discrètement sans rien demander.
Personne ne le remarquait en général, parce que le flux avait livré tout le tour de toute façon. Mais un téléphone resté en veille pendant le tour, et revenu après l'expiration de la mémoire tampon de 120 secondes, ne pouvait pas obtenir les événements manquants depuis le flux, et la réconciliation censée combler l'écart n'avait jamais été exécutée.
La correction
- L'envoi indique à la réconciliation à quel fil appartient le tour, afin que le premier tour d'un nouveau clavardage soit réconcilié comme tous les autres. Si vous avez ouvert un autre clavardage quand la réponse arrive, le résultat est écarté plutôt qu'affiché au mauvais endroit.
- Une réconciliation échouée est retentée. Un téléphone qui se réveille avec une mauvaise connexion peut trouver le tour terminé puis échouer à le récupérer. Cela est maintenant retenu, et le clavardage réessaie lorsque l'onglet redevient visible ou que le réseau revient.
- « Travaillé pendant » est honnête. Chaque réponse indique combien de temps l'agent a travaillé. Si l'onglet n'a jamais vu le message de fin de tour du serveur, il comblait cette valeur avec sa propre horloge, qui partait de l'envoi jusqu'au réveil du téléphone, temps d'absence compris. Ce chiffre est maintenant marqué comme une estimation, et remplacé par la durée enregistrée dès que l'historique arrive.
Ce que nous en avons retenu
- Testez sur l'appareil que les gens utilisent réellement, de la façon dont ils l'utilisent. Les deux bogues se trouvaient dans l'écart entre « un flux qui fonctionne » et « un téléphone dans une poche ».
- Une solution de repli qui ne s'exécute jamais n'en est pas une. L'étape de réconciliation existait justement 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.
- Ne présentez pas une supposition comme un fait. Une durée mesurée sur la mauvaise horloge est pire que rien ; étiquetez-la ou remplacez-la.
Le même travail a aussi amélioré quelques éléments que vous verrez pendant qu'un tour s'exécute : les étapes de commande shell sont désignées par la commande qui fait le travail, plutôt que par cd ; les captures d'écran du clavardage conservent le haut à gauche de la page et s'ajustent à la colonne ; et un nouveau projet reçoit son nom généré sans rafraîchissement.
Si vous créez votre propre app pour téléphones, nos guides sur la création d'une app web adaptée aux mobiles et apps natives ou applications web progressives couvrent les bases. Pour en savoir plus sur le clavardage lui-même, consultez la documentation du clavardage.