Mantenir el xat viu quan el telèfon s'adorm
L'agent de Mythex pot treballar minuts en una sola petició, i és probable que la mires des d'un telèfon —que es bloqueja, canvia d'aplicació i canvia de xarxa mentre treballa. Dos errors feien que això anés malament. En un, el xat tractava cada senyal de «la pàgina torna a ser visible» com una prova que la seva connexió s'havia mort, i entrava en bucle fins quedar-se a «Connectant…». A l'altre, un telèfon que s'havia adormit durant la primera resposta d'un xat nou tornava amb només els primers trossos, fins que s'actualitzava la pàgina manualment. Tots dos estan arreglats.
Com segueix el xat un torn en curs
Mentre l'agent treballa, el xat manté obert un flux des dels nostres servidors: cada pas —un pensament, una crida a una eina, un fragment de la resposta— arriba com un esdeveniment. Si el flux es talla, el xat es torna a connectar i el servidor reprodueix els esdeveniments recents d'un buffer que guarda els darrers 120 segons. Quan el torn acaba, el xat també demana al servidor l'historial desat i concilia el que mostrava amb el que s'ha emmagatzemat. Aquest últim pas atrapa qualsevol cosa que el flux s'hagi perdut.
Per distingir una connexió viva d'una morta quan no passa res, el servidor envia un petit «ping» cada 15 segons.
Error 1: despertar matava un flux sa
Els navegadors avisen a una pàgina quan torna a ser visible: després d'un canvi de pestanya, després que la pantalla es desbloquegi. Nosaltres ho usàvem com a senyal per comprovar la connexió —i, a la pràctica, per avortar el flux i reconnectar, suposant que s'havia mort mentre estava amagat.
Als telèfons i als navegadors integrats, aquests esdeveniments es disparen molt més sovint que no es moren els fluxos —cada canvi de pestanya, cada desbloqueig, i en alguns navegadors integrats cada parell de segons més o menys. Cada un avortava un flux perfectament sa. El xat es tornava a connectar, reproduïa, tornava a ser avortat, i acabava a «Connectant…». Després deia que el torn havia acabat mentre l'agent encara treballava.
La solució: jutjar el flux per si està parlant
Ara el xat registra quan el flux de cada projecte va rebre res per última vegada —esdeveniments i pings de 15 segons, tots dos. Un senyal de «visible de nou» només avorta un flux que ha estat en silenci durant 25 segons: més que l'interval dels pings més un petit retard de xarxa, així que un flux viu mai no compleix la condició. Les proves comproven que un ping compta com a senyal de vida, i que un flux que acaba de fer ping no es tracta com a mort.
La regla que n'hem tret: la visibilitat d'una pàgina diu alguna cosa sobre la pàgina, no sobre la connexió de xarxa. Pregunta a la connexió.
Error 2: mitja resposta després que el telèfon es despertés
Aquest el vam poder reproduir cada vegada al simulador d'iOS:
- Comença un xat nou i envia una petició que triga una mica.
- Deixa que el telèfon s'adormi durant la construcció.
- Torna quan el torn ja ha acabat i el buffer de reproducció de dos minuts ha caducat.
El xat mostrava els primers blocs de la resposta, marcats com a acabats —i es quedava així fins que refrescaves la pàgina.
Per què
Un xat nou no té un fil —la conversa desada— fins que el primer missatge el crea. Això passa dins de la funció d'enviament, després que l'enviament ja hagués capturat el pas de conciliació, que encara pensava que no hi havia cap fil. Així que al final del primer torn en un xat nou, la conciliació no veia cap fil i tornava sense demanar res.
Normalment ningú no ho notava, perquè el flux ja havia entregat el torn sencer. Però un telèfon que s'havia adormit durant el torn i tornava després que el buffer de reproducció de 120 segons hagués caducat no podia obtenir els esdeveniments que faltaven des del flux —i la conciliació que hauria d'haver omplert el buit mai no s'havia executat.
La solució
- L'enviament indica a la conciliació a quin fil pertany el torn, de manera que el primer torn d'un xat nou es concilia com qualsevol altre. Si has obert un altre xat quan arriba la resposta, el resultat es descarta en lloc de mostrar-se al lloc equivocat.
- Una conciliació fallida es torna a intentar. Un telèfon que es desperta amb una mala connexió pot trobar que el torn ha acabat i després no aconseguir obtenir-lo. Això ara es recorda, i el xat ho torna a demanar quan es mostra la pestanya de nou o quan la xarxa torna.
- «Ha treballat durant» és honest. Cada resposta mostra quant ha treballat l'agent. Si la pestanya mai no va veure el missatge de final de torn del servidor, abans el xat l'omplia amb el seu propi rellotge —que anava des de Envia fins que el telèfon es despertava, incloent-hi el temps fora. Aquesta xifra ara es marca com a estimació, i se substitueix per la durada desada quan arriba l'historial.
Què n'hem après
- Prova al dispositiu que la gent realment fa servir, de la manera en què el fa servir. Tots dos errors vivien a l'espai entre «un flux que funciona» i «un telèfon a la butxaca».
- Una solució de recanvi que mai no s'executa no és una solució de recanvi. El pas de conciliació existia precisament per atrapar aquest cas, i el saltava en silenci.
- Torna a intentar també la recuperació. El moment en què un telèfon es desperta sovint és quan la seva connexió està en el pitjor estat.
- No mostris una suposició com si fos un fet. Una durada des del rellotge equivocat és pitjor que cap; etiqueta-la o substitueix-la.
El mateix treball també va netejar algunes coses que veuràs mentre s'executa un torn: els passos de shell s'etiqueten per l'ordre que fa la feina en lloc de cd, les captures de pantalla del xat mantenen la part superior esquerra de la pàgina i encaixen a la columna, i un projecte nou agafa el seu nom generat sense refrescar.
Si estàs construint la teva pròpia app per a telèfons, les nostres guies sobre com construir una web adaptada al mòbil i aplicacions natives vs aplicacions web progressives cobreixen les bases. Més sobre el xat en si és a la documentació del xat.