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

3.5 KiB
Raw Blame History

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 больше не переиспользуется для готовности вариантов.
  • Данные/миграции: изменений схемы не требуется.