Questo bugfix ha lo scopo di adattare AgentDesktop/CTToolbar7 e di CTPhone7 per mitigare gli effetti della tecnica di Timer Throttling che Chrome ha adottato negli ultimi aggiornamenti.
Questa tecnica anche se ideata per un risparmio energetico può andare ad inficiare tutti quei processi automatici e periodici di rinnovo della sessione tra client (browser) e server.
Articolo e spiegazioni qui:
https://www.tomshw.it/hardware/google-chrome-si-prepara-a-ridurre-luso-della-batteria/
https://developer.chrome.com/blog/timer-throttling-in-chrome-88/
Al fine di non farci invalidare le sessioni abbiamo capito che la comunicazione WebSocket dovrebbe essere sempre “risvegliata” sul client se è la controparte server che invia un messaggio, non il contrario.
Per questo motivo abbiamo modificato CTPhone7 al fine di considerare come invalida la connessione verso la Toolbar non alla prima KeepAlive mancata ma bensì dopo il fallito tentativo di attuare una procedura di recovery specifica che abbiamo inserito in questa ultima versione.
In caso contrario se è il client che invia dei messaggi sulla base di Timer Javascript allora dopo 5 minuti di inattività Chrome dovrebbe parcellizzare i timer ogni minuto (questa era lo scenario attivo fino ad oggi).
Cosa si intende per inattività di Chrome?
Anche Google non è chiara a tal riguardo. Semplicemente sembrerebbe che si considera la pagina aperta in Google come inattivita quando la proprietà “visibility” cambia da true a false.
Io ho simulato il Throttling semplicemente aprendo la Toolbar con CTPhone7 su di un Tab, ho spostato il focus su di un secondo Tab aprendo un sito a piacere e ho minimizzato il browser per 5 min.
E’ inoltre possibile andare sulle impostazioni di Chrome (chrome://flags) e controllare la modalità di Throttling con il seguente parametro:
Elenco modifiche a CTPhone7
Il timeout sulla KeepAlive da Toolbar è stato portato da 60 sec a 65 sec.
Se il timeout dovesse scattare dopo 65 secondi, l’interno non viene subito rimosso ma viene eseguita una procedura di recovery descritta di seguito:
Vengono eseguiti 3 tentativi di invio di un nuovo messaggio sulla WebSocket di “KeepAlive_Ping”. Ogni tentativo è distanziato dal successivo di 5 sec.
La Toolbar una volta che riceve questo messaggio dovrebbe rispondere con un KeepAlive classico per far ritornare la comunicazione in condizioni di normalità e risvegliare la Socket.
Se la Toolbar non risponde a seguito di 3 invii allora CTPhone7 considera la sessione come persa e l’interno viene rimosso e deregistrato.
Di seguito la sequenza di quello che appare nei log di CTPhone7 in caso di procedura di recovery fallita dopo il terzo tentativo:
2021-03-22 18:39:38.9912 - [INFO] [KEEPALIVE] Elapsed Max Waiting Time on KeepAlive Connection [541de7d3-6a56-4ac6-98f2-31d0946663ae] 2021-03-22 18:39:39.0012 - [INFO] [KEEPALIVE] At least one connection is alive [541de7d3-6a56-4ac6-98f2-31d0946663ae] Open [True] KeepAlive [False] 2021-03-22 18:39:39.0012 - [INFO] [KEEPALIVE] Missing KeepAlive from Toolbar. Send message #1 to wake up WebSocket javascript connection. 2021-03-22 18:39:39.0211 - [INFO] [WEBSOCKET] [SND] [{"command": "KeepAlive_Ping", "response": ""}] 2021-03-22 18:39:44.0340 - [INFO] [KEEPALIVE] Missing KeepAlive from Toolbar. Send message #2 to wake up WebSocket javascript connection. 2021-03-22 18:39:44.0440 - [INFO] [WEBSOCKET] [SND] [{"command": "KeepAlive_Ping", "response": ""}] 2021-03-22 18:39:49.0647 - [INFO] [KEEPALIVE] Missing KeepAlive from Toolbar. Send message #3 to wake up WebSocket javascript connection. 2021-03-22 18:39:49.0647 - [INFO] [WEBSOCKET] [SND] [{"command": "KeepAlive_Ping", "response": ""}] 2021-03-22 18:39:54.0945 - [INFO] [KEEPALIVE] Destroy SIP Account due to elapsed KeepAlive Ping timer on all connections 2021-03-22 18:39:54.0945 - [INFO] [JAVASCRIPT] Invoke Javascript statement in PluginSIP module [destroyAccount();] 2021-03-22 18:39:54.1134 - [INFO] [CTPHONE7|PLUGINSIP] Received Command [destroyAccount] 2021-03-22 18:39:54.1134 - [INFO] [CTPHONE7|PLUGINSIP] [UNREGISTER] 2021-03-22 18:39:54.3219 - [INFO] [CTPHONE7|PLUGINSIP] Distruzione della pagina web del modulo PluginSIP [about:blank]
Elenco modifiche ad AgentDesktop:
Alla ricezione del nuovo messaggio da parte di CTPhone7 “KeepAlive_Ping” viene risposto con una KeepAlive.