R
1. октрытая страница isOnline=true
2. перезагружаем страницу
3. isOnline=false
4. страница перезагрузилась
5. isOnline=true
6. запрос graphql на сервер отдает isOnline=false?
Size: a a a
R
DD
R
KR
async function pingUserConnection(container, user, ws) {
const { id: sessId } = await container.resolve('wsSessionParser').parse(ws);
const db = container.resolve('db');
let lastPingTime = new Date();
let lastPongTime = new Date();
updateUserStatus(user.id, sessId, true, false, container);
const stopPing = () => {
clearInterval(intervalId);
updateUserStatus(user.id, sessId, false, false, container);
}
const intervalId = setInterval(() => {
const shouldMarkOffline = differenceInMinutes(lastPongTime, lastPingTime) > 2;
if (shouldMarkOffline) {
stopPing();
ws.close();
return
}
if (ws.readyState === 1) {
ws.ping();
lastPingTime = new Date();
} else {
stopPing();
}
}, ONE_MINUTE_IN_MILLIS * 2);
ws.on('pong', async () => {
lastPongTime = new Date();
const actualUser = await db.models.user.findByPk(user.id)
updateUserStatus(user.id, sessId, actualUser.isOnline, actualUser.isSleep, container);
});
ws.on('close', () => {
stopPing();
ws.close();
});
}
R
KR
A
R
R
async function processConnection(container, user, ws) {
const mutex = container.resolve('mutex')
const { id: sessId } = await container.resolve('wsSessionParser').parse(ws);
await mutex.lock();
await updateUserStatus(user.id, sessId, true, container)
mutex.release();
ws.on('close', async () => {
await mutex.lock();
await updateUserStatus(user.id, sessId, false, container)
ws.close()
mutex.release();
});
}
R
DD
R
DD
async function processConnection(container, user, ws) {
const mutex = container.resolve('mutex')
const { id: sessId } = await container.resolve('wsSessionParser').parse(ws);
await mutex.lock();
await updateUserStatus(user.id, sessId, true, container)
mutex.release();
ws.on('close', async () => {
await mutex.lock();
await updateUserStatus(user.id, sessId, false, container)
ws.close()
mutex.release();
});
}
R
DD
R
DD
DD
R
DD