07 — Оффлайн-режим: что доступно без сети и объёмы данных
Детализация требований CLI-3…CLI-5 и NFR-3. Определяет, что именно синхронизируется на устройство, что догружается по правилам, а что работает только онлайн — с оценкой объёмов.
Обещание оффлайна (что гарантируем пользователю)
- Клиент: назначенная тренировка открывается без сети всегда; записываются веса, повторы, результаты, ПМ и комментарии; работает таймер. GIF/видео — если успели закэшироваться (см. уровни ниже), иначе плейсхолдер — функциональность не ломается.
- Тренер: конструктор работает без сети — создание, редактирование, копирование тренировок на основе полной текстовой базы упражнений (метаданные синхронизированы всегда, медиа — по мере необходимости).
- Все оффлайн-изменения синхронизируются автоматически при появлении сети (CLI-5), включая отложенную отправку видео от клиента (VID-3, этап 2).
Три уровня данных
Уровень 1 — всегда на устройстве (полная синхронизация)
Структурированные данные — лёгкие, синхронизируются целиком через PowerSync:
| Данные | Оценка объёма |
|---|---|
| Метаданные всей базы упражнений (~1 500 шт.: названия RU/EN, инструкции, мышцы, оборудование, связи замен/прогрессий) | ~5–10 МБ |
| Программы, тренировки, результаты пользователя (клиент — свои; тренер — своих клиентов) | < 5 МБ за год активного использования |
| Профили, ПМ, история показателей, комментарии, шаблоны тренера | < 5 МБ |
| Итого уровень 1 | ~10–20 МБ — незаметно для пользователя |
Вывод: вся текстовая часть продукта оффлайн всегда, для любого объёма клиентов тренера. Ограничивать нужно только медиа.
Уровень 2 — prefetch по правилам (упреждающая загрузка медиа)
Медиа, которое понадобится с высокой вероятностью, качается заранее, пока есть сеть:
- GIF упражнений из назначенных тренировок на ближайшие 7–14 дней (клиент) — тренировки известны заранее, это и есть главный оффлайн-сценарий.
- Видео тренера, привязанные к назначенным тренировкам (этап 2) — по настройке «загружать только по Wi-Fi».
| Сценарий | Оценка |
|---|---|
| Неделя тренировок клиента: ~5 тренировок × ~10 упражнений = ~50 GIF × 0,3–1 МБ (360×360) | ~15–50 МБ |
| Видео тренера к неделе тренировок (если есть): 2–3 ролика × 30–100 МБ | ~60–300 МБ — только по Wi-Fi, по настройке |
Уровень 3 — только онлайн (+ кэш после просмотра)
- Свободный браузинг всей медиабазы упражнений (GIF грузятся на лету, просмотренные остаются в LRU-кэше).
- Стриминг видео тренера вне prefetch-окна.
- Лидерборды, публичные страницы, платежи, загрузка новых видео.
Почему не «вся база оффлайн»
| Вариант | Объём | Вердикт |
|---|---|---|
| Вся база GIF 360×360 (~1 400 шт.) | ~0,5–1,5 ГБ | ❌ Недопустимо как дефолт |
| Вся база GIF 180×180 | ~300–500 МБ | ⚠️ Как дефолт — нет; допустимо как опция для тренера: «Скачать базу целиком» (по Wi-Fi), для работы в залах без связи |
| Метаданные + prefetch назначенного | ~30–70 МБ | ✅ Дефолт |
Правила кэша
- Лимит медиакэша по умолчанию: 500 МБ, вытеснение LRU; размер настраивается в приложении.
- Prefetch — только по Wi-Fi по умолчанию (настройка: «и по мобильной сети»).
- Очередь исходящих: результаты/комментарии (лёгкие — уходят сразу при появлении сети), видео клиента (тяжёлые — по Wi-Fi, с индикатором «ожидает отправки»).
Следствия для реализации
- Sync-правила PowerSync (bucket'ы): уровень 1 описывается декларативно — «клиент видит свои назначения», «тренер видит своих клиентов». Медиа в PowerSync не синхронизируется вообще — только URL; загрузкой управляет отдельный media-cache-слой приложения.
- Оценки объёмов проверяются на сэмпле EDB (30 бесплатных GIF — реальные размеры файлов) в рамках спайка №1 из 06 — Технологический стек.
- Дизайнеру: состояния «GIF ещё не загружен» (плейсхолдер со схемой/названием), «видео ожидает Wi-Fi», «результат ожидает синхронизации» — обязательные состояния UI, а не крайние случаи.