Совместная работа — общее редактирование проекта
Совместная работа позволяет нескольким участникам открывать один проект: видны присутствующие, курсоры на плане, схеме и щите, а также комментарии с привязкой к точке или элементу. Правки синхронизируются через WebSocket и CRDT-движок, конфликты геометрии разрешаются автоматически.
Роли участников
Доступ выдаётся с одной из трёх ролей. Роль задаётся при создании ссылки или приглашении по email и может быть отозвана владельцем.
| Роль | Что может участник |
|---|---|
| viewer | Просмотр проекта без правок |
| checker | Просмотр и комментарии (проверка) |
| co-editor | Совместное редактирование |
Как пользоваться: пошагово
- Откройте проект и создайте ссылку для шеринга: укажите роль (viewer / checker / co-editor) и при желании срок действия в часах. Без открытого проекта ссылка не создаётся.
- Пригласите участников — отправьте ссылку или приглашение по email на нужную роль.
- Участник открывает ссылку и подтверждает подключение в диалоге согласия (один раз на вкладку). Диалог показывается только для проверенных адресов (см. «Безопасность ссылок»).
- Работайте вместе: курсоры коллег видны на холсте, комментарии обсуждаются прямо на плане, правки соавтора (co-editor) применяются к вашей модели автоматически.
- Завершите доступ — отзовите доступ участника или отключите ссылку, когда проверка закончена. Список участников виден владельцу проекта.
Курсоры и присутствие
- Курсор каждого участника имеет свой цвет и имя; видно, на каком виде он находится: план, однолинейная схема или щит.
- Список присутствующих показывает, кто сейчас онлайн.
- При обрыве соединения клиент переподключается автоматически примерно через 3 секунды и запрашивает недостающие изменения с сервера.
Комментарии
- Комментарий привязывается к точке на плане (координаты) или к элементу (например, автомату или розетке), можно упоминать участников.
- У комментария два статуса: «открыт» и «решён». Ответы (replies) хранятся внутри комментария.
- Список можно фильтровать по статусу и по элементу — удобно проверять замечания по конкретному щиту или помещению.
Как устроена синхронизация и конфликты
Каждая правка выполняется как команда и преобразуется в CRDT-операции (LWW-регистры, OR-множества, векторные часы с метками Лэмпорта). Клиент применяет операцию локально и рассылает её как delta-сообщение; при подключении запрашивает недостающее (sync_request → sync_response), а полное состояние может прийти снимком (snapshot). Удалённые операции применяются к локальному хранилищу автоматически.
- Одновременные правки одного объекта разрешаются детерминированно (побеждает более новая метка времени).
- Геометрические конфликты стен и трасс разбирает отдельный resolver: пересечения и наложения не приводят к «разъезжанию» модели.
- Редактируемый объект можно заблокировать; блокировка снимается автоматически примерно через 30 секунд, поэтому зависших блокировок не бывает.
Безопасность ссылок
- По WebSocket разрешены только проверенные адреса: wss:// — только хосты gorkycad.pro и поддомены; ws:// — только localhost и 127.0.0.1 для локальной разработки (например, ws://localhost:3001/collab). Остальное (http/https, чужие хосты, мусор) отклоняется.
- Диалог согласия никогда не расширяет этот список: подтверждение пользователя работает только для уже разрешённого адреса.
- Согласие запоминается на вкладку (sessionStorage, ключ gorkycad:collab-consent) — в новой вкладке спросят снова. В приватном режиме без доступа к хранилищу диалог может повторяться.
- Для локальной разработки адрес переключается на локальный сервер перед подключением (по умолчанию порт 3001).
Типичные ошибки
- «Проект не открыт» при создании ссылки или приглашении — сначала откройте проект, затем делитесь.
- Ссылка не подключается и диалог согласия не появляется — адрес отклонён проверкой (чужой хост или http/https вместо wss). Проверьте, что ссылка ведёт на gorkycad.pro.
- Нет курсоров и правок коллеги — соединение ещё не установлено или оборвалось; дождитесь автопереподключения, проверьте сеть.
- Комментарий не виден — проверьте фильтр по статусу (открыт/решён) и привязку к элементу.
Ограничения
- Для живой синхронизации нужен онлайн: WebSocket-соединение с сервером совместной работы.
- Гость без роли co-editor не может править модель (viewer — только просмотр, checker — просмотр и комментарии).
- Ссылка может иметь срок действия; просроченная ссылка не подключает.
См. также
Частые вопросы
Чем отличаются роли viewer, checker и co-editor?
Viewer только смотрит проект, checker смотрит и оставляет комментарии, co-editor совместно редактирует модель.
Коллега открыл ссылку, но я его не вижу. Что делать?
Проверьте, что он подтвердил диалог согласия, что ссылка не просрочена и что соединение установлено (при обрыве клиент переподключается сам за несколько секунд).
Что будет при одновременной правке одного объекта?
Применяется CRDT-правило: побеждает более новая операция по метке времени, геометрия стен и трасс дополнительно разбирается resolver-ом, данные не теряются молча.
Безопасно ли открывать ссылку из письма?
Клиент подключается только к gorkycad.pro (wss) или к localhost (ws, разработка). Ссылка на чужой сервер отклоняется до показа диалога, чужой хост никогда не подставляется в интерфейс.