socket.io, Node.js Как понять, что у пользователя сейчас открыт чат, чтобы отмечать сообщений прочитанными?

Буду благодарен за помощь. Хотелось бы понять правильную практику использования сокетов в чате Node.js и socket.io. А именно есть три вопроса на которые я так и не нашел ответа. Например

  1. userA и userB находятся в чате и мне нужно отмечать сообщения прочтенными, если userA отправляет userB. Есть такая идея. Каждый раз, когда userA открывает чат, делаю sockee event с chatId и в redis записываю: userId, chatId.

  2. Мне нужно знать, когда user онлайн или оффлайн. Для этого я добавил в таблицу user lastActivity Datetime. Есть проблема с ее обновлением. На текущий момент я сделал так:

app.use((req, res, next) => {
    let lastActivity = Date.now();
    await database.set(userId, lastActivity); # каждый request api обновляет поле в таблице
    next();
});
Но мне кажется, что каждый запрос вызывающий обновление - плохая практика.

С другой стороны я мог бы при подключении и отключении к сокетам добавить обновление lastAcitviy, но мне кажется это не лучшее решение в плане нагрузки.

socket.on(`connect`, () => {
    let lastActivity = Date.now();
    await database.set(userId, lastActivity);
    join(userId) # подписываюсь на события
}); 

socket.on(`disconnect`, () => {
    leave(userId) # отписываюсь  (понятно, могут быть таймауты и прочие вещи
});

  

  1. При открытии чата, мне нужно сразу же отобразить 15 сообщений используя пагинацию. Можно реализовать через api get, но тогда пройдет какое-то время перед их отображением пока выполниться запрос. Можно через сокеты запросить (но маловероятно, что это так правильно). Возможно с массивом чатов и передавать previewMessages, где будет какое-то количество сообщений. Т.е. при открытии чата, не нужно ничего подгружать.

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