Skip to content

Несколько вкладок ​

worker-sync-db синхронизирует все открытые вкладки одного origin через SharedWorker, имя которого задаётся dbName.

Как это работает ​

  1. Каждая вкладка вызывает createDatabase с одной и той же schema и dbName.
  2. Вкладки подключаются к одному SharedWorker (если браузер его поддерживает).
  3. Локальные put / delete пишут в IndexedDB внутри worker.
  4. Worker рассылает события change портам, которые вызвали subscribe на эту коллекцию.
typescript
const unsub = db.subscribe('todos', (event) => {
  if (event.type === 'put') {
    // refresh UI with event.doc
  }
});

React: useQuery подписывается за вас; useSubscribe отдаёт сырой поток событий.

Требования ​

ТребованиеЗачем
Один dbNameScope SharedWorker + имя IndexedDB
Одна schemaИначе SchemaMismatch
Один originИзоляция SharedWorker в браузере
Активный subscribe на вкладкеFan-out только на подписанные порты
mode: 'auto' или 'shared'Dedicated-режим — только внутри вкладки

Поддержка браузеров ​

  • SharedWorker — Chromium и Firefox. Нужен для синхронизации между вкладками.
  • Safari / некоторые WebView — без SharedWorker. При mode: 'auto' библиотека переключается на dedicated worker (без синхронизации между вкладками).
typescript
const db = await createDatabase({
  schema,
  dbName: 'my-app',
  mode: 'auto',
  sharedWorker: sharedWorkerUrl,
  dedicatedWorker: dedicatedWorkerUrl,
});

Попробуйте ​

  1. Откройте живое демо.
  2. Дублируйте вкладку.
  3. Добавьте или переключите todo — вторая вкладка обновится сразу.

Если что-то не работает ​

Если изменения не появляются в другой вкладке, см. Устранение проблем. Архитектура: Архитектура.

MIT License · offline-first IndexedDB и синхронизация через SharedWorker