chore(openspec): archive completed changes and sync main specs
- fix-large-album-load -> photos, realtime, media-objects - fix-album-cover -> photos, albums
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
# 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` больше не переиспользуется для готовности вариантов.
|
||||
- Данные/миграции: изменений схемы не требуется.
|
||||
Reference in New Issue
Block a user