На сайте люди заходят и редактируют свои проекты. Иногда случается одна из следующих ситуаций:
1. Два человека одновременно зашли редактировать проект.
2. Человек открыл форму редактирования, начал что-то делать и ушел, не закрыв и не сохранив изменения. Потом пришел домой, там что-то сделал. На сл. утро вернулся на работу и продолжил редактировать открытую форму.
В общем случаются проблемы, клиенты пишут нам, мы долго разбираемся в чем дело и тп.
В итоге решили сделать так: как только проект открыт на редактирование, у всех остальных людей, которые имеют к нему доступ, он блокируется и сообщается, что проект в данный момент кем-то редактируется.
Я для этого написал небольшую программу на nodejs.
const WebSocket = require('ws');
let locked = [];
WSS.on('connection', ws => {
ws.on('close', () => {
delete locked[i];
broadcastMessage(id, {type: 'updateLocks', data: locked);
});
ws.on('message', json => {
if (message.type === 'lock') {
locked.push({project_id: message.data.id});
}
broadcastMessage(id, {type: 'updateLocks', data: locked);
});
broadcastMessage(id, {type: 'updateLocks', data: locked);
});
Код я упростил, но все примитивно. Человек открыл проект на редактирование - на сервере id проекта добавили в массив. Закрыл проект или закрыл браузер - удаляем id проекта из массива.
Сервис работает уже несколько месяцев и все хорошо, но время от времени (три раза за все время), люди писали, что они проект закрыли, а он так и остался заблокирован.
Я несколько раз все тщательно анализировал, в коде ошибок не нашел. Разве что происходит какая-то ситуация, котрую я не учел, когда человек ушел, но сообщение по какой-то причине на сервер не пришло. Думаю написать проверку, которая будет выполняться каждые 10 секунд и обходить массив подключенных людей. Если кто-то из них отвалился, то удалять проекты.
Подскажите, могут ли быть какие-то баги? Хорошая ли идея написать дополнительную проверку?