Вы сказали, что сервер отправляет вам оставшееся время в секундах.Таким образом, вы можете рассчитать на стороне клиента, когда обратный отсчет должен закончиться во время клиента.Вы можете хранить это в локальном хранилище.Когда открывается новая вкладка, вы можете использовать это значение для инициализации вашего таймера.
Это не требует, чтобы клиентское время было правильным или синхронизированным со временем сервера, поскольку все вкладки имеют одинаковое (возможно, неправильное) клиентское время.Вас интересует только разница в секундах между текущим временем клиента и временем клиента, которое вы сохранили для правильной инициализации вашего таймера.
Решение для его вычисления может выглядеть примерно так:
// when receiving the remaining seconds in the first tab
const onReceivedRemaining = (remaining) => {
const now = new Date(); // current client time
now.setSeconds(now.getSeconds() + remaining); // timer end in client time
localStorage.set('elapsing', JSON.stringify(now));
}
// when initializing the timer in a second tab
const getInitial = () => {
const elapsing_string = localStorage.get('elapsing');
if (!elapsing_string) return null;
const now = new Date();
const elapsing = Date.parse(elapsing_string);
return (elapsing - now) / 1000; // remaining time in seconds
}