# WatchTogether Модуль синхронизированного просмотра для Lampac. Работает одновременно как **хранитель состояния** и как **тихий lparty-клиент**: комната живёт в канале реле, а сервер незаметно подхватывает роль хоста, если создатель отключился. Клиентский плагин основан на [lparty.js](https://nrsua.github.io/lampa-nrs/lparty.js) (nrsua, levende) и полностью wire-совместим с его экосистемой — JustPlus Player, lparty-web и стоковый lparty.js подключаются к тем же комнатам без правок. ## Как это работает 1. **Создание комнаты.** Человек создаёт комнату в любом lparty-клиенте — его клиент открывает канал `wss:///wt/c/lparty-r-` и является хостом. 2. **Тень.** Сервер видит адрес подключения и начинает пассивно слушать кадры канала: копирует url, метаданные, позицию, скорость и список участников. В списке зрителей он виден как `Lampac`, но ничего не рассылает. 3. **Подмена.** Как только соединение хоста рвётся, сервер мгновенно шлёт кадр `host` и продолжает timeline с последнего хартбита (лаг ≤ 2с, пауза — точно). Попытки других клиентов перехватить хостство отклоняются повторным `host=сервер`. 4. **Возврат.** Создатель переподключился — сервер отдаёт ему роль и снова уходит в тень. 5. **GC.** Пустые комнаты удаляются через `gc_empty_timeout_minutes`, любые — через `gc_max_lifetime_hours`. ## HTTP (обзор) | Маршрут | Описание | | ----------------------- | ------------------------------------------------------------------------------------------------------------------ | | `GET /watchtogether.js` | Плагин для клиента Lampa (адаптированный lparty.js). | | `GET /watch_together/` | Веб-плеер для анонимных гостей (адаптированный lparty-web). Поддерживает `?room=` и `?relay=`. | | `WS /wt/c/{channel}` | LParty-совместимый релей: каналы, кадры join/leave/message, эхо с серверным временем. | ## Скорость воспроизведения Наши клиенты передают скорость поле `sp` в кадрах `state`/`sync`/`act`/`hold`/`go` и применяют её к `playbackRate`. Стоковые клиенты поле молча игнорируют — обратная совместимость не нарушается. Если автор JustPlus добавит поддержку `sp`, синхронизация заработает у него автоматически. ## Конфигурация Секция в `init.conf`: **`WatchTogether`**. | Поле | Смысл | | ------------------------------- | ----------------------------------------------------------------------------------------------------- | | `enable` | Включение модуля (по умолчанию **true**). | | `allow_anonymous` | Доступ к плагину `/watchtogether.js` и веб-плееру lparty-web без авторизации (по умолчанию **true**). | | `relay_max_channels` | Лимит одновременных каналов реле (по умолчанию **500**). | | `relay_max_clients_per_channel` | Лимит участников одного канала (по умолчанию **32**). | | `gc_empty_timeout_minutes` | Удаление пустой комнаты через N минут (по умолчанию **30**). | | `gc_max_lifetime_hours` | Удаление любой комнаты через N часов (по умолчанию **12**). | ## Подключение клиентов - Плагин Lampa: `/watchtogether.js` — реле уже настроено на собственный сервер lampac. - JustPlus Player / lparty.js: в настройках клиента указать адрес реле `ws(s)://<адрес-lampac>/wt/c/`. - Веб-гость: открыть `https:///watch_together/?room=` — ссылку формирует плагин.