SyncEngine
SyncEngine -- центральный компонент оффлайн-архитектуры evntflo. Он отвечает за:
- Сохранение изменений в локальную базу данных (IndexedDB через Dexie.js)
- Отслеживание изменений, ожидающих синхронизации (
pendingSync=true) - Отправку изменений на сервер при восстановлении связи
- Получение обновлений с сервера (delta sync)
- Дедупликацию для предотвращения дублей
Жизненный цикл изменения
1. Создание изменения
Когда вы выполняете действие (например, check-in участника), SyncEngine:
- Записывает изменение в IndexedDB с флагом
pendingSync=true - Присваивает метку времени
clientTs(текущее время на устройстве) - Увеличивает счетчик ожидающих изменений в индикаторе
- Немедленно отражает изменение в интерфейсе (оптимистичное обновление)
2. Отправка на сервер
При наличии соединения SyncEngine:
- Извлекает все записи с
pendingSync=true - Сортирует их по
clientTs(от старых к новым) - Отправляет пакетом на сервер
- Ожидает подтверждения от сервера
3. Подтверждение
После успешного ответа сервера:
- Флаг
pendingSyncснимается (false) для каждой отправленной записи - Счетчик ожидающих изменений уменьшается
- Если все изменения отправлены, индикатор переключается на зеленый
4. Обработка ошибок
При ошибке отправки:
- Изменения остаются с
pendingSync=true - Повторная попытка выполняется через 30 секунд
- Максимум 5 попыток, после чего -- уведомление пользователю
Delta sync
Delta sync позволяет получать с сервера только те данные, которые изменились после последней синхронизации, вместо загрузки всего набора данных.
Как это работает
- SyncEngine хранит метку времени последней успешной синхронизации в таблице
meta. - При синхронизации отправляется запрос с параметром
since:
GET /sync/delta?since=2026-07-15T10:30:00Z&entities=registrations,payments
- Сервер возвращает только записи, измененные после указанного времени.
- SyncEngine обновляет локальную базу данных и сохраняет новую метку времени.
Параметры запроса
| Параметр | Описание |
|---|---|
since | ISO 8601 метка времени последней успешной синхронизации |
entities | Список типов сущностей через запятую: registrations, payments, events |
Преимущества
- Экономия трафика. Передаются только изменения, а не все данные
- Быстрота. Синхронизация занимает секунды, а не минуты
- Надежность. Если синхронизация прервалась, следующая попытка начнет с того же
since
Автоматическая синхронизация
SyncEngine отслеживает состояние сети и автоматически запускает синхронизацию в следующих случаях:
При восстановлении связи
Когда устройство переходит из оффлайн в онлайн:
- Обнаруживается событие
online(Network Information API) - SyncEngine проверяет доступность сервера (ping)
- Отправляются ожидающие изменения (upload)
- Запрашиваются обновления с сервера (download via delta sync)
Периодическая синхронизация
В онлайн-режиме SyncEngine периодически проверяет наличие обновлений на сервере, чтобы данные оставались актуальными (например, если другой член команды отметил check-in с другого устройства).
Дедупликация
Для предотвращения дублирования изменений используется композитный ключ:
clientTs + userId
Каждое изменение уникально идентифицируется комбинацией метки времени создания на клиенте и идентификатора пользователя. Если одно и то же изменение отправлено повторно (например, из-за сетевого таймаута), сервер распознает дубликат по этому ключу и вернет подтверждение без повторного применения.
Это гарантирует идемпотентность -- повторная отправка одного и того же набора изменений не приводит к ошибкам или дублированию данных.
Порядок синхронизации
Изменения отправляются строго в хронологическом порядке по clientTs. Это критично для корректности:
- Check-in участника в 10:05 не может быть перезаписан отменой check-in в 10:03
- Ручная отметка оплаты в 11:00 применяется после изменения статуса в 10:55
Если часы устройства отличаются от серверного времени, SyncEngine компенсирует разницу при первой успешной синхронизации.
Объем локального хранилища
Локальная база данных IndexedDB имеет ограничения, зависящие от браузера и устройства:
| Платформа | Типичный лимит |
|---|---|
| Chrome / Edge | До 80% свободного места на диске |
| Safari | До 1 ГБ |
| Firefox | До 2 ГБ |
Для типичного мероприятия (до 2 000 участников) объем данных составляет 5-20 МБ, что далеко от лимитов любого браузера.
При приближении к лимиту хранилища SyncEngine показывает предупреждение и предлагает очистить данные завершенных мероприятий.