В современных браузерах есть запрос маяка, который отправляет запрос, когда вкладка / windows закрывается и гарантирует ее доставку (она не будет отменена).
С ее помощью вы можете отправить запрос на прекращение сеанса.
Более подробную информацию вы можете прочитать здесь: https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API/Using_the_Beacon_API
window.onunload = function analytics(event) {
if (!navigator.sendBeacon) return;
var url = "https://example.com/analytics";
// Create the data to send
var data = "state=" + event.type + "&location=" + location.href;
// Send the beacon
var status = navigator.sendBeacon(url, data);
// Log the data and result
console.log("sendBeacon: URL = ", url, "; data = ", data, "; status = ", status);
};
Обычная реализация - отправка запроса пинга каждые N секунд и сохраните метку времени последнего запроса в сеансе. Когда сессия начинает проверять свою временную метку с текущей и сбрасывает переменные текущей сессии, если она отличается более чем на 2-3 таймфрейма.