Hacker News Digest

17 августа 2025 г. в 06:51 • finkelstein.fr • ⭐ 166 • 💬 35

OriginalHN

#sqlite#wasm#reactivity#sync#crdt#postgresql#broadcast-channel-api#triiggers

Lessons learned from building a sync-engine and reactivity system with SQLite

Итоги постройки синхронизатора и реактивной системы на SQLite

Первый опыт: PGlite + Electric

  • PostgreSQL в WASM + Electric даёт точную синхронизацию и LISTEN-реактивность.
  • Недостатки: Electric ещё молод, старт до минуты без компакции; PGlite в single-user-режиме течёт памятью и тормозит при росте БД.

Переосмысление задачи

  • SQLite-WASM стал зрелым; моё приложение однопользовательское и почти всегда онлайн.
  • Значит, достаточно простого собственного решения.

Минимальный синхронизатор

  1. При первом запуске клиент вытягивает всё по updated_at.
  2. Каждые 2–3 с опрашивает сервер за записями новее этой метки и делает upsert.
  3. Локально при каждом UPDATE ставится флаг modified = 1; фоновый процесс отправляет изменения.
  4. Для текстов можно добавить CRDT (Yjs) на случай конфликтов.
    Для отслеживания изменений используется триггер, который игнорируется во время синхронизации через таблицу sync_control.

Реактивность на SQLite

  • SQLite не умеет LISTEN, но:
    1. Триггер пишет в лог-таблицу пару «таблица + id».
    2. Broadcast Channel API рассылает это в другие вкладки/воркеры.
    3. UI подписывается на канал и перечитывает нужные строки.
  • Использую wa-sqlite: стабильно, без сбоев с момента установки.