import _ from 'lodash'; import PouchDB from 'pouchdb'; import uri from '../lib/ids'; import changeHandler from './change-handler'; const dbDefinitionId = uri('dbdef', {}); const currentDbDefinition = { _id: dbDefinitionId, type: dbDefinitionId, def: { version: '0.000001' }, }; declare global { var localDb: any; var db: any; var dbReady: boolean; } export const initDb = async (params: any) => { console.log({ caller: 'initDb' }); if (globalThis.localDb === undefined) { globalThis.localDb = new PouchDB('$local_dyomedea$', { auto_compaction: true, revs_limit: 10, }); } if (globalThis.db === undefined) { globalThis.db = new PouchDB('dyomedea', { auto_compaction: false, }); } const db = globalThis.db; var previousDbDefinition = { _id: dbDefinitionId, type: dbDefinitionId, def: { version: '0' }, }; try { previousDbDefinition = await db.get(dbDefinitionId); } catch (error: any) { if (error.status !== 404) { console.log( `Unexpected error fetching db definition: ${JSON.stringify(error)}` ); return; } } if (previousDbDefinition.def.version < currentDbDefinition.def.version) { previousDbDefinition.def = currentDbDefinition.def; db.put(previousDbDefinition); // TODO: support migrations } //await await db.compact(); globalThis.dbReady = true; const sync = PouchDB.sync( 'dyomedea', 'http://admin:password@localhost:5984/dyomedea', { live: true, retry: true, } ) .on('change', function (info) { // handle change console.log({ caller: 'Sync / change', info }); }) .on('paused', function (err) { // replication paused (e.g. replication up to date, user went offline) console.log({ caller: 'Sync / paused', err }); }) .on('active', function () { // replicate resumed (e.g. new changes replicating, user went back online) console.log({ caller: 'Sync / active' }); }) .on('denied', function (err) { // a document failed to replicate (e.g. due to permissions) console.error({ caller: 'Sync / denied', err }); }) .on('complete', function (info) { // handle complete console.log({ caller: 'Sync / complete', info }); }) .on('error', function (err) { // handle error console.error({ caller: 'Sync / error', err }); }); console.log({ caller: 'initDb / before db.changes' }); const changes = db .changes({ since: 'now', live: true, include_docs: false }) .on('change', changeHandler) .on('complete', (info: any) => { console.log({ caller: 'changes / complete', info }); }) .on('error', (error: any) => { console.log({ caller: 'changes / complete', error }); }); // console.log({ caller: 'initDb / back from db.changes', changes }); // changes.cancel(); };