Files
ds-galo/openspec/changes/archive/2026-10-11-fix-large-album-load/proposal.md
T
iu d99ac77587 chore(openspec): archive completed changes and sync main specs
- fix-large-album-load -> photos, realtime, media-objects
- fix-album-cover -> photos, albums
2026-10-11 14:16:38 +03:00

47 lines
3.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.
# Proposal
## Why
Большие альбомы (например `seed-1791714157-0 #2`, 1000 фото) открываются медленно и
«мерцают». Замеры на реальной базе: запрос списка фото выполняется за ~1 мс, но при
открытии первые 50 ячеек — это ещё не обработанные фото («обработка…»), генерация
вариантов идёт со скоростью ~2 фото/с (порядка 8 минут на альбом), а сетка перетасовывается
из-за семантики SSE-событий и перекачивается из-за нестабильных подписанных URL.
## What Changes
- **Стабильные ссылки на объекты.** Подписанный URL перестаёт меняться каждую секунду:
срок действия квантуется по окну, ответы бэкенда получают `Cache-Control`, чтобы браузер
переиспользовал уже загруженные превью вместо повторной загрузки.
- **Корректная семантика SSE-событий.** Готовность вариантов worker'а публикуется как
изменение фото (не как новое фото), поэтому клиент обновляет уже показанное фото и не
вставляет чужие фото в начало сетки. Событие изменения фото добавляется в набор
отслеживаемых на клиенте.
- **Ускорение и приоритезация очереди вариантов.** Повышается пропускная способность
генерации вариантов (параллелизм и параметры пакета) и свежие фото обрабатываются первыми,
чтобы видимый экран заполнялся превью быстрее.
## Capabilities
### New Capabilities
<!-- нет -->
### Modified Capabilities
- `photos`: подписанные URL становятся детерминированными в пределах окна и отдаются с
заголовками кэширования.
- `realtime`: готовность вариантов публикуется как изменение фото; набор событий включает
изменение фото.
- `media-objects`: очередь генерации вариантов получает настраиваемую пропускную способность
и приоритет по свежести фото.
## Impact
- Backend: `internal/storage/signer.go`, `internal/app/app.go` (заголовки объектов),
`internal/photos/worker.go`, `internal/photos/sqlite_objects.go` (порядок и пакет claim),
`internal/config/config.go` (параметры worker'а).
- Frontend: `src/lib/sse.ts` (набор событий), `src/routes/(app)/albums/[id]/+page.svelte`
(обработка событий и вставка в сетку).
- Поведение/совместимость: подписанный URL живёт до `ttl + окно` вместо `ttl`; событие
`photo.created` больше не переиспользуется для готовности вариантов.
- Данные/миграции: изменений схемы не требуется.