Socket. Io Асинхронный таймер

Привет
Всем привет, идея в том, что бы реализовать таймер обратного отсчета, для разных страниц

Клиент
( _id Это уникальный id для каждой страниц, страниц много поэтому у каждой свой таймер )
То есть клиент заходит на страницу, на странице есть кнопка обновить
таймер, при нажатии срабатывает событие offer

socket.emit('connectRoom', { id_room : _id });

socket.on("timerUpdate", data => console.log(data)  );

socket.emit('offer', { id_room : _id });

Сервер

io.on('connection', function(socket){

    let obj = { time : null };
    
    // Создаем отдельную комнату для текущей страницы
    socket.on('connectRoom', function(data){
        socket.join(data.id_room);
    });
    
    // Функция таймера 
    let timer = (id_room) => {
      let i = 60;
      obj.time = setInterval(() => {
         io.sockets.in(id_room).emit('timerUpdate', i); 
         i--;
      }, 1000);
    };

    // При получении события обновить удаляем старый таймер 
    // и запускаем новый
    socket.on('offer', function(data){
        clearInterval(obj.time);
        timer(data.id_room);
    });


});

Все работает не так как хотелось, то есть клиент заходит на определенную страницу, запускает таймер кнопкой обновить
таймер запускается и все работает хорошо

Если заходит новый клиент на ту же страницу он видит текущий таймер
И это тоже здорово
Но если новый клиент обновит таймер то функция clearInterval не срабатывает и в консоли следующая картина

Запустил таймер 1 клиент
60
59
58

Зашел новый клиент и обновил таймер
60
57
59
56
58


То есть работают 2 таймера одновременно, соответсвено если 3 клиент обновит таймер то уже 3 параллельных таймера

Вопрос в том, как избежать такое поведение и сделать один общий таймер для текущей комнаты

Проблема в том что таймеры создаются отдельно для каждого подключения. В области видимости функции-коллбека io.on('connection', function(socket) {.

Тебе нужно организовать код так чтобы сущность, отвечающая за таймеры, не создавалась в коллбеке соединения (получается она будет своей собственно для каждого соединения, а ты хочешь общую сущность). И при этом знала в какой сокет слать сообщение об обновлении (тут, похоже, поможет концепция комнат самого socket.io).

И не забудь убивать таймеры когда клиенты отключаются (или когда выходит время, или когда верное время убийства таймера согласно бизнес требованиям). Иначе приложение будет выедать память по мере своей работы до момента когда его надо рестартовать.

let timers = {}

io.on('connection', function(socket) {
  socket.on('connectRoom', function(data) {
    socket.join(data.id_room);
  });
  socket.on('offer', function(data) { // передавай от клиента информацию о комнате в котороую пришел offer
    clearInterval(timers[data.id_room]);  // ничего страшного если айдишника интервала нет
    timers[data.id_room] = setInterval(() => {
      io.sockets.in(data.id_room).emit('timerUpdate', i);
      i--;
    }, 1000);
  });
});

Да все верно, спасибо большое !!!