# realtime Specification ## Purpose Поток событий альбома и персональный поток через Server-Sent Events. ## Requirements ### Requirement: Подписка на события альбома Клиент SHALL иметь возможность подписаться на события конкретного альбома через SSE. #### Scenario: Подписка на альбом - **WHEN** участник подключается к SSE-потоку альбома - **THEN** система устанавливает text/event-stream и отправляет heartbeat ### Requirement: События альбома Система SHALL публиковать события photo.created, photo.updated, photo.deleted, comment.created, like.added, like.removed, member.joined, member.left, album.updated. Событие photo.created SHALL обозначать появление фото в альбоме, а готовность вариантов существующего фото SHALL публиковаться как photo.updated. #### Scenario: Новое фото - **WHEN** в альбоме появляется фото - **THEN** подписчики получают событие photo.created с метаданными и URL превью #### Scenario: Готовы варианты - **WHEN** для существующего фото сгенерированы thumb и preview - **THEN** подписчики получают событие photo.updated с этим фото ### Requirement: Персональный поток Клиент SHALL иметь возможность подписаться на персональный поток (приглашения, уведомления). #### Scenario: Подписка на персональный поток - **WHEN** пользователь подключается к персональному потоку - **THEN** система отправляет ему персональные события ### Requirement: Авторизация и область доступа Клиент SHALL подписываться только на доступные ему альбомы; токен передаётся в query-параметре. #### Scenario: Подписка на недоступный альбом - **WHEN** пользователь подписывается на альбом, к которому нет доступа - **THEN** система отклоняет подключение ### Requirement: Устойчивость соединения Система SHALL отправлять heartbeat каждые 25 секунд и отключать медленных клиентов при переполнении буфера. #### Scenario: Переполнение буфера клиента - **WHEN** буфер клиента переполняется - **THEN** система отключает клиента ### Requirement: Догон пропущенного Клиент SHALL иметь возможность догнать пропущенные события через REST. #### Scenario: Переподключение - **WHEN** клиент переподключается после разрыва - **THEN** клиент догоняет события через запрос фото с параметром since ### Requirement: Различение добавления и обновления фото Клиент SHALL различать добавление нового фото в альбом и обновление уже показанного: обновление SHALL изменять фото на месте, не меняя порядок сетки. #### Scenario: Обновление отображаемого фото - **WHEN** приходит событие обновления для фото, которое уже показано - **THEN** клиент обновляет его на месте, порядок сетки не меняется #### Scenario: Обновление отсутствующего фото - **WHEN** приходит событие обновления для фото, которого нет в текущем списке - **THEN** клиент не добавляет его в сетку