Simplification
This commit is contained in:
parent
0e714ac361
commit
79fed3cc28
|
@ -10,44 +10,63 @@ import {
|
||||||
putAccount,
|
putAccount,
|
||||||
getAccountById,
|
getAccountById,
|
||||||
} from '../db/account';
|
} from '../db/account';
|
||||||
|
import { openDatabases } from './open';
|
||||||
|
import { toHex } from '../lib/to-hex';
|
||||||
|
|
||||||
PouchDB.plugin(indexeddb);
|
PouchDB.plugin(indexeddb);
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
var localDb: any;
|
var localDb: any;
|
||||||
var db: any;
|
var db: any;
|
||||||
|
var currentAccount: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
const initDb = async () => {
|
const initDb = async () => {
|
||||||
if (globalThis.localDb === undefined) {
|
if (globalThis.localDb === undefined) {
|
||||||
globalThis.localDb = new PouchDB('_local_dyomedea_', {
|
globalThis.currentAccount = await openDatabases();
|
||||||
adapter: 'indexeddb',
|
const currentAccount = globalThis.currentAccount;
|
||||||
auto_compaction: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const accounts = await getAccounts();
|
if (currentAccount.remoteDbServer) {
|
||||||
console.log({ caller: 'initDb', accounts });
|
const url = `${currentAccount.remoteDbServer}/userdb-${toHex(
|
||||||
|
currentAccount.remoteDbUser
|
||||||
|
)}`;
|
||||||
|
|
||||||
if (accounts.length === 0) {
|
const remoteDb = new PouchDB(url, {
|
||||||
accounts[0] = initialAccount;
|
auth: {
|
||||||
await putAccount({ id: initialAccount.id, account: initialAccount });
|
username: currentAccount.remoteDbUser,
|
||||||
}
|
password: currentAccount.remoteDbPassword,
|
||||||
|
},
|
||||||
const settings = await getSettings();
|
skip_setup: true,
|
||||||
let currentAccount = getAccountById(accounts, settings.currentAccountId);
|
});
|
||||||
if (currentAccount === undefined) {
|
const sync = PouchDB.sync(db, remoteDb, {
|
||||||
settings.currentAccountId = accounts[0].id;
|
live: true,
|
||||||
await putSettings({ settings });
|
retry: true,
|
||||||
currentAccount = accounts[0];
|
})
|
||||||
}
|
.on('change', function (info) {
|
||||||
|
// handle change
|
||||||
console.log({ caller: 'initDb', settings, currentAccount });
|
console.log({ caller: 'Sync / change', info });
|
||||||
if (globalThis.db === undefined) {
|
})
|
||||||
globalThis.db = new PouchDB(currentAccount.localDb, {
|
.on('paused', function (err) {
|
||||||
adapter: 'indexeddb',
|
// replication paused (e.g. replication up to date, user went offline)
|
||||||
auto_compaction: true,
|
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 });
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
120
src/db/index.ts
120
src/db/index.ts
|
@ -1,6 +1,7 @@
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import PouchDB from 'pouchdb';
|
import PouchDB from 'pouchdb';
|
||||||
import indexeddb from 'pouchdb-adapter-indexeddb';
|
import indexeddb from 'pouchdb-adapter-indexeddb';
|
||||||
|
import { openDatabases } from '../db-admin/open';
|
||||||
import uri from '../lib/ids';
|
import uri from '../lib/ids';
|
||||||
import { toHex } from '../lib/to-hex';
|
import { toHex } from '../lib/to-hex';
|
||||||
import {
|
import {
|
||||||
|
@ -12,16 +13,6 @@ import {
|
||||||
import changeHandler from './change-handler';
|
import changeHandler from './change-handler';
|
||||||
import { getSettings, putSettings } from './settings';
|
import { getSettings, putSettings } from './settings';
|
||||||
|
|
||||||
PouchDB.plugin(indexeddb);
|
|
||||||
|
|
||||||
const dbDefinitionId = uri('dbdef', {});
|
|
||||||
|
|
||||||
const currentDbDefinition = {
|
|
||||||
_id: dbDefinitionId,
|
|
||||||
type: dbDefinitionId,
|
|
||||||
def: { version: '0.000001' },
|
|
||||||
};
|
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
var localDb: any;
|
var localDb: any;
|
||||||
var db: any;
|
var db: any;
|
||||||
|
@ -33,109 +24,8 @@ export const initDb = async () => {
|
||||||
|
|
||||||
if (globalThis.localDb === undefined) {
|
if (globalThis.localDb === undefined) {
|
||||||
globalThis.dbReady = false;
|
globalThis.dbReady = false;
|
||||||
globalThis.localDb = new PouchDB('_local_dyomedea_', {
|
|
||||||
adapter: 'indexeddb',
|
|
||||||
auto_compaction: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const accounts = await getAccounts();
|
await openDatabases();
|
||||||
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 });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// console.log({ caller: 'initDb / before db.changes' });
|
// console.log({ caller: 'initDb / before db.changes' });
|
||||||
|
|
||||||
|
@ -163,12 +53,6 @@ export const initDb = async () => {
|
||||||
|
|
||||||
// changes.cancel();
|
// changes.cancel();
|
||||||
|
|
||||||
console.log({
|
|
||||||
caller: 'initDb (end)',
|
|
||||||
dbinfo,
|
|
||||||
activeTasks: PouchDB.activeTasks.list(),
|
|
||||||
storage: await navigator.storage.estimate(),
|
|
||||||
});
|
|
||||||
globalThis.dbReady = true;
|
globalThis.dbReady = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue