socket.io, Node.js Как понять, что у пользователя сейчас открыт чат, чтобы отмечать сообщений прочитанными?
Буду благодарен за помощь. Хотелось бы понять правильную практику использования сокетов в чате Node.js и socket.io. А именно есть три вопроса на которые я так и не нашел ответа. Например
userA и userB находятся в чате и мне нужно отмечать сообщения прочтенными, если userA отправляет userB. Есть такая идея. Каждый раз, когда userA открывает чат, делаю sockee event с chatId и в redis записываю: userId, chatId.
Мне нужно знать, когда 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) # отписываюсь (понятно, могут быть таймауты и прочие вещи
});
- При открытии чата, мне нужно сразу же отобразить 15 сообщений используя пагинацию. Можно реализовать через api get, но тогда пройдет какое-то время перед их отображением пока выполниться запрос. Можно через сокеты запросить (но маловероятно, что это так правильно). Возможно с массивом чатов и передавать previewMessages, где будет какое-то количество сообщений. Т.е. при открытии чата, не нужно ничего подгружать.