Несколько вкладок
worker-sync-db синхронизирует все открытые вкладки одного origin через SharedWorker, имя которого задаётся dbName.
Как это работает
- Каждая вкладка вызывает
createDatabaseс одной и той жеschemaиdbName. - Вкладки подключаются к одному SharedWorker (если браузер его поддерживает).
- Локальные
put/deleteпишут в IndexedDB внутри worker. - Worker рассылает события
changeпортам, которые вызвалиsubscribeна эту коллекцию.
typescript
const unsub = db.subscribe('todos', (event) => {
if (event.type === 'put') {
// refresh UI with event.doc
}
});React: useQuery подписывается за вас; useSubscribe отдаёт сырой поток событий.
Требования
| Требование | Зачем |
|---|---|
Один dbName | Scope 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,
});Попробуйте
- Откройте живое демо.
- Дублируйте вкладку.
- Добавьте или переключите todo — вторая вкладка обновится сразу.
Если что-то не работает
Если изменения не появляются в другой вкладке, см. Устранение проблем. Архитектура: Архитектура.