Files
jellybit/openspec/changes/archive/2026-06-30-live-status/proposal.md
T
avandClaude Opus 4.8 ef75a0d302 Живые обновления прогресса и раздел «Раздача» (live-status)
Воркер ведёт in-memory снимок телеметрии раздач (прогресс, скорость, ETA,
рейтинг, сиды/пиры, отдано) под отдельным RWMutex, обновляя его на каждом
тике поллинга сразу после построения byHash — без лишних вызовов qBittorrent
и без хранения в БД (волатильно). qbt.Torrent дополнен полями телеметрии.

Веб-UI читает снимок через узкий контракт LiveStatus: карточки активных
загрузок показывают живой прогресс-бар (htmx-поллинг фрагмента every 3s,
точечно — без сброса фильтров), на странице загрузки появилась секция
«Раздача» для сидирующих задач. Начальный кадр рендерится сразу со
значениями; при отсутствии данных UI деградирует штатно.

Капабилити live-status (OpenSpec), web-ui дополнен. Change заархивирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 20:38:25 +03:00

58 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
Сейчас прогресс скачивания в веб-UI виден только при ручной перезагрузке
страницы, а статистики раздачи (рейтинг, сиды/пиры, отдано) нет вовсе — в
фазе 1 секцию намеренно отложили до появления живых данных. Воркер уже
опрашивает qBittorrent каждые несколько секунд и держит свежее состояние
каждой задачи — нужно лишь сохранить эту телеметрию в памяти и показать её в
UI без перезагрузки. Это «однооконный» сервис: смотреть, как идёт загрузка,
должно быть видно вживую.
## What Changes
- Воркер на каждом тике поллинга сохраняет **in-memory снимок** телеметрии
всех известных раздач (прогресс, скорость загрузки, ETA + для раздачи:
рейтинг, число сидов/пиров, отдано, скорость отдачи). Снимок волатильный,
в БД не пишется.
- `qbt.Torrent` дополняется полями телеметрии (`dlspeed`, `eta`, `ratio`,
`num_seeds`, `num_leechs`, `uploaded`, `upspeed`) из `/torrents/info`
лишний сетевой вызов не добавляется, они приходят в том же ответе.
- `httpapi` получает новую зависимость-источник телеметрии и **фрагмент-роут**;
активные карточки на главной поллят свой прогресс через htmx и обновляют
прогресс-бар/скорость/ETA на месте, без перезагрузки страницы и без сброса
клиентских фильтров.
- На странице загрузки `/download/{id}` появляется секция **«Раздача»** с
живой статистикой (рейтинг, сиды/пиры, отдано, скорость отдачи) для задач,
чей торрент сидирует.
- htmx, который уже вендорится и грузится, впервые задействуется (`hx-*`).
## Capabilities
### New Capabilities
- `live-status`: живая телеметрия загрузок и раздач — воркер как единственный
сэмплер qBittorrent ведёт in-memory снимок прогресса/скорости/ETA и
статистики раздачи; веб-UI отображает её в реальном времени (поллинг
фрагментов) без перезагрузки страницы и без хранения в БД.
### Modified Capabilities
- `web-ui`: страница загрузки `/download/{id}` получает секцию живой
статистики раздачи (в фазе 1 явно вынесена из scope «вводится вместе с
живыми обновлениями»); карточки активных загрузок на главной показывают
живой прогресс-бар через htmx-поллинг.
## Impact
- **Код:** `internal/qbt` (поля `Torrent`), `internal/worker` (снимок +
геттер телеметрии под отдельным RWMutex), `internal/httpapi` (dep-интерфейс
`LiveStatus`, фрагмент-роут, секция раздачи, прогресс во view), `cmd/jellybit`
(инъекция снимка в `httpapi.Deps`), `web/templates` (прогресс-бар на
карточках + htmx-атрибуты, секция «Раздача»), `web/static/css` при
необходимости (стили прогресс-бара уже есть в дизайн-системе).
- **БД:** изменений нет — телеметрия волатильна, миграций/ER не требуется.
- **Внешние вызовы:** дополнительных нет (расширяется только разбор
существующего ответа `/torrents/info`).
- **Безопасность:** телеметрия не содержит секретов; контракт чтения снимка
изолируется так, чтобы будущий апгрейд доставки до SSE не ломал API.