Как серверу понять что запросы прекратились
Всем привет. У меня есть сервер который каждую минуту принимает /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 минуту и 30 секунд, когда таймер тикнет тогда мы поймем что запросы прекратились.
- Когда получили 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 });
});