Разделите транспорт, состояние документа и UI. Храните неподтверждённые операции, повторяйте их с прежним operationId и применяйте серверную версию только после проверки конфликта.
Как спроектировать форму с WebSocket для нестабильной сети?
Разделите транспорт, состояние документа и UI. Храните неподтверждённые операции, повторяйте их с прежним operationId и применяйте серверную версию только после проверки конфликта.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Учебная форма содержит name и comment. Сервер присылает snapshot {version,fields}, принимает patch {baseVersion,operationId,changes} и подтверждает {operationId,version}. Соединение может оборваться после отправки, вкладку можно обновить. Как обеспечить понятное и безопасное редактирование?
Ответ
Разделите транспорт, состояние документа и UI. Храните неподтверждённые операции, повторяйте их с прежним operationId и применяйте серверную версию только после проверки конфликта.
Сервер дедуплицирует operationId и отвергает несовместимый baseVersion. После reconnect клиент получает актуальный snapshot и согласует очередь, а не безусловно перезаписывает сервер своим черновиком. UI различает «изменено», «отправляется», «сохранено» и «конфликт». Локальное хранение учитывает чувствительность полей и очистку при logout. Наследование классов не обязательно: транспорт можно оформить адаптером с явными событиями и cleanup.