diff --git a/src/db-admin/health.ts b/src/db-admin/health.ts index 0bfc634..2f400f9 100644 --- a/src/db-admin/health.ts +++ b/src/db-admin/health.ts @@ -10,44 +10,63 @@ import { putAccount, getAccountById, } from '../db/account'; +import { openDatabases } from './open'; +import { toHex } from '../lib/to-hex'; PouchDB.plugin(indexeddb); declare global { var localDb: any; var db: any; + var currentAccount: any; } const initDb = async () => { if (globalThis.localDb === undefined) { - globalThis.localDb = new PouchDB('_local_dyomedea_', { - adapter: 'indexeddb', - auto_compaction: true, - }); - } + globalThis.currentAccount = await openDatabases(); + const currentAccount = globalThis.currentAccount; - const accounts = await getAccounts(); - console.log({ caller: 'initDb', accounts }); + if (currentAccount.remoteDbServer) { + const url = `${currentAccount.remoteDbServer}/userdb-${toHex( + currentAccount.remoteDbUser + )}`; - 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, { - adapter: 'indexeddb', - auto_compaction: true, - }); + const remoteDb = new PouchDB(url, { + auth: { + username: currentAccount.remoteDbUser, + password: currentAccount.remoteDbPassword, + }, + skip_setup: true, + }); + const sync = PouchDB.sync(db, remoteDb, { + 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 }); + }); + } } }; diff --git a/src/db-admin/open.ts b/src/db-admin/open.ts new file mode 100644 index 0000000..49bcd2e --- /dev/null +++ b/src/db-admin/open.ts @@ -0,0 +1,50 @@ +import PouchDB from 'pouchdb'; +import indexeddb from 'pouchdb-adapter-indexeddb'; +import { + getAccounts, + initialAccount, + putAccount, + getAccountById, +} from '../db/account'; +import { getSettings, putSettings } from '../db/settings'; + +PouchDB.plugin(indexeddb); + +declare global { + var localDb: any; + var db: any; +} + +export const openDatabases = async () => { + globalThis.localDb = new PouchDB('_local_dyomedea_', { + adapter: 'indexeddb', + auto_compaction: true, + }); + + 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, { + adapter: 'indexeddb', + auto_compaction: true, + }); + } + + return currentAccount; +}; diff --git a/src/db/index.ts b/src/db/index.ts index 66fbac2..e516439 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,6 +1,7 @@ import _ from 'lodash'; import PouchDB from 'pouchdb'; import indexeddb from 'pouchdb-adapter-indexeddb'; +import { openDatabases } from '../db-admin/open'; import uri from '../lib/ids'; import { toHex } from '../lib/to-hex'; import { @@ -12,16 +13,6 @@ import { import changeHandler from './change-handler'; import { getSettings, putSettings } from './settings'; -PouchDB.plugin(indexeddb); - -const dbDefinitionId = uri('dbdef', {}); - -const currentDbDefinition = { - _id: dbDefinitionId, - type: dbDefinitionId, - def: { version: '0.000001' }, -}; - declare global { var localDb: any; var db: any; @@ -33,109 +24,8 @@ export const initDb = async () => { if (globalThis.localDb === undefined) { globalThis.dbReady = false; - globalThis.localDb = new PouchDB('_local_dyomedea_', { - adapter: 'indexeddb', - auto_compaction: true, - }); - 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, { - adapter: 'indexeddb', - auto_compaction: true, - }); - } - const db = globalThis.db; - const dbinfo = await db.info(); - // db.compact(); - console.log({ - caller: 'initDb', - dbinfo, - activeTasks: PouchDB.activeTasks.list(), - storage: await navigator.storage.estimate(), - }); - // - 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(); - - if (currentAccount.remoteDbServer) { - const url = `${currentAccount.remoteDbServer}/userdb-${toHex( - currentAccount.remoteDbUser - )}`; - - const remoteDb = new PouchDB(url, { - auth: { - username: currentAccount.remoteDbUser, - password: currentAccount.remoteDbPassword, - }, - skip_setup: true, - }); - const sync = PouchDB.sync(db, remoteDb, { - 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 }); - }); - } + await openDatabases(); // console.log({ caller: 'initDb / before db.changes' }); @@ -163,12 +53,6 @@ export const initDb = async () => { // changes.cancel(); - console.log({ - caller: 'initDb (end)', - dbinfo, - activeTasks: PouchDB.activeTasks.list(), - storage: await navigator.storage.estimate(), - }); globalThis.dbReady = true; } };