Как серверу понять что запросы прекратились

Всем привет. У меня есть сервер который каждую минуту принимает /ping запрос. Мне нужно узнать когда запросы прекратились и сделать что-то в этом случае. Я написал что-то похожее, но не уверен что правильно реализовал. Возможно есть какой-то другой подход или способ узнать что запросы прекратились?

router.get('/ping', async (req, res) => {
      const tokenKey = decrypt(process.env.SECRET, req.cookies[settings.cookieUserToken])
      await userinfo.addPingTime(tokenKey, Date.now());

      setTimeout(async () => {
        const userInfo = await userinfo.get(tokenKey);
        if(Date.now() - userInfo.pingTime > 60000) {
          webPush.sendNotification(userInfo.subscriptionInfo, JSON.stringify({title: 'You`re close this app, click to re-open'}));
        }
      },60000)

      respond(res, { status: 200 });
    });


Ответы (1 шт):

Автор решения: Иван Недзвецкий

Из этих вводных можно предложить такой алгоритм:

  1. Ставим таймер на 1 минуту и 30 секунд, когда таймер тикнет тогда мы поймем что запросы прекратились.
  2. Когда получили ping запрос удаляем таймер и ставим снова.
let t = null; //Обязательна нужна переменная где-то в глобальной области
router.get('/ping', async (req, res) => {
      const tokenKey = decrypt(process.env.SECRET, req.cookies[settings.cookieUserToken])
      await userinfo.addPingTime(tokenKey, Date.now());

      if (t) {
       clearTimeout(t);
      }


      t = setTimeout(async () => {
        // Запросы прекратились
        const userInfo = await userinfo.get(tokenKey);
        webPush.sendNotification(userInfo.subscriptionInfo, JSON.stringify({title: 'You`re close this app, click to re-open'}));
      }, 90000); // 1 min 30 sec


      respond(res, { status: 200 });
});

Можно использовать не 1 минуту 30 секунд а меньший интервал если вы уверены что запросы приходят равномерно.

Если у вас много разных пользователей и для каждого надо понимать момент когда прекратились запросы то нужно хранить много таймеров, например так.

let userTimers = {}; // объект где хранятся все таймеры пользователей
router.get('/ping', async (req, res) => {
      const tokenKey = decrypt(process.env.SECRET, req.cookies[settings.cookieUserToken])
      await userinfo.addPingTime(tokenKey, Date.now());

      const userId = tokenKey.id; //Тут как-то получаем id пользователя, это может быть строка или число

      if (userTimers[userId]) {
       clearTimeout(userTimers[userId]);
      }


      userTimers[userId] = setTimeout(async () => {
        // Запросы прекратились
        const userInfo = await userinfo.get(tokenKey);
        webPush.sendNotification(userInfo.subscriptionInfo, JSON.stringify({title: 'You`re close this app, click to re-open'}));
        delete userTimers[userId]; //Удаляем таймер чтоб не занимать память
      }, 90000); // 1 min 30 sec


      respond(res, { status: 200 });
});
→ Ссылка