import _ from 'lodash'; import PouchDB from 'pouchdb'; import uri from '../lib/ids'; import { getAccountById, getAccounts, initialAccount, putAccount, } from './account'; import changeHandler from './change-handler'; import { getSettings, putSettings } from './settings'; 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, }); } const accounts = await getAccounts(); console.log({ caller: 'initDb', accounts }); if (accounts.length === 0) { accounts[0] = initialAccount; await putAccount({ id: initialAccount.id, account: initialAccount }); } const settings = await getSettings(); let currentAccount = getAccountById(accounts, settings.currentAccountId); if (currentAccount === undefined) { settings.currentAccountId = accounts[0].id; await putSettings({ settings }); currentAccount = accounts[0]; } console.log({ caller: 'initDb', settings, currentAccount }); if (globalThis.db === undefined) { globalThis.db = new PouchDB(currentAccount.localDb, { 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(); // 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(); globalThis.dbReady = true; };