baton/docs/adr/ADR-002-offline-pattern.md
Gros Frumos 2ee953866b kin: BATON-ARCH-014 Доработать ADR-002 и ADR-004 по замечаниям ревью
- Создан docs/adr/ADR-002-offline-pattern.md (Accepted, дата 2026-03-20)
  с секцией Open Questions: #1001, охват 78.75%, ACTION:/конвенция #1049
- ADR-004: добавлен "exponential backoff согласно решению #1046" к строке 429/retry_after
- ARCHITECTURE.md: добавлена вводная фраза "ADR-файлы хранятся в docs/adr/"
  и строка таблицы для ADR-002 (Accepted)
- tests/test_arch_004.py: удалены 4 теста на отсутствие ADR-002,
  устаревшие после создания нового ADR-002 (BATON-ARCH-014 supersedes)
- tests/test_arch_014.py: 14 новых тестов для критериев приёмки
- Все 216 тестов: passed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 22:05:04 +02:00

2.8 KiB
Raw Blame History

ADR-002: Паттерн офлайн-очереди

Дата: 2026-03-20 Статус: Accepted Автор: Architect Agent (Kin pipeline, BATON-001) Решения: #1001, #1003, #1006


Контекст

Baton — приложение экстренного сигнала. Критичное требование: сигнал не должен быть потерян, если пользователь нажал кнопку в момент отсутствия сети (тоннель, слабый сигнал, офлайн).

Данный ADR фиксирует исходное архитектурное решение по паттерну офлайн-очереди. Актуальная реализация с деталями вариантов — в ADR-007.


Решение

IndexedDB outbox + BackgroundSync + online event fallback

  1. Кнопка нажата → немедленная попытка fetch('/api/signal')
  2. Ошибка или offline → запись в IndexedDB outbox
  3. Trigger 1: window.addEventListener('online', flushOutbox) — main thread, все браузеры
  4. Trigger 2: SW регистрирует registration.sync.register('flush-outbox') — Chromium только

Обоснование

  • #1006: IndexedDB — единственный вариант, доступный и в main thread, и в Service Worker. Общее хранилище исключает дублирование кода между app.js и sw.js.
  • #1003: localStorage в iOS Safari приватном режиме бросает SecurityError → не подходит для надёжного офлайн-хранилища в приложении экстренного сигнала.
  • BackgroundSync (#1001): браузер управляет повтором, flush возможен даже при закрытой вкладке (Chrome). Dual trigger (BackgroundSync + online event) страхует пользователей Safari/Firefox.

Open Questions

Вопрос о покрытии BackgroundSync: Решение #1001 фиксирует охват BackgroundSync как ~85%. Актуальные данные caniuse (март 2026) показывают 78.75% — Safari и Firefox не поддерживают API. Это влияет на описание архитектурных гарантий: ручной online-fallback является обязательным, а не опциональным элементом.

ACTION: Обновить решение #1001 — изменить охват BackgroundSync с 85% до 78.75%, пометить ручной fallback как обязательный элемент архитектуры (конвенция #1049).