From 233d754258a54c291aeecadd0def598e9972545f Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Mon, 13 Feb 2023 19:44:49 -0600 Subject: [PATCH] Batch restore database --- src/agent/database.ts | 10 +++------- src/agent/workers/database.js | 12 ++++++++++-- src/app/index.ts | 6 +++--- src/util/types.ts | 6 +++--- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/agent/database.ts b/src/agent/database.ts index ff6af9d1..7333411c 100644 --- a/src/agent/database.ts +++ b/src/agent/database.ts @@ -89,6 +89,7 @@ const removeItems = (storeName, ...args) => callLocalforage(storeName, 'removeIt const length = storeName => callLocalforage(storeName, 'length') const clear = storeName => callLocalforage(storeName, 'clear') const keys = storeName => callLocalforage(storeName, 'keys') +const dump = storeName => callLocalforage(storeName, 'dump') const iterate = (storeName, where = {}) => ({ [Symbol.asyncIterator]() { @@ -211,12 +212,7 @@ const defineTable = (name: string, pk: string, opts: TableOpts = {}): Table => { // Sync from storage initially ;(async () => { const t = Date.now() - const initialData = {} - for await (const {k, v} of iterate(name)) { - if (isValid(v)) { - initialData[k] = v - } - } + const initialData = filter(isValid, await dump(name)) if (resetOnInit) { await clear(name) @@ -310,6 +306,6 @@ const ready = derived(pluck('ready', Object.values(registry)), all(identity)) export default { getItem, setItem, setItems, removeItem, removeItems, length, clear, keys, - iterate, watch, getPersonWithFallback, clearAll, people, rooms, messages, + dump, iterate, watch, getPersonWithFallback, clearAll, people, rooms, messages, alerts, relays, routes, ready, } diff --git a/src/agent/workers/database.js b/src/agent/workers/database.js index 67e3f045..b44e78ed 100644 --- a/src/agent/workers/database.js +++ b/src/agent/workers/database.js @@ -27,14 +27,22 @@ addEventListener('message', async ({data: {topic, payload, channel}}) => { const instance = getStore(storeName) const result = await switcherFn(method, { + dump: () => new Promise(resolve => { + const result = {} + + instance.iterate( + (v, k, i) => { result[k] = v }, + () => resolve(result), + ) + }), setItems: () => { for (const [k, v] of Object.entries(args[0])) { instance.setItem(k, v) } }, removeItems: () => { - for (const [k, v] of Object.entries(args[0])) { - instance.removeItem(k, v) + for (const k of args[0]) { + instance.removeItem(k) } }, default: () => instance[method](...args), diff --git a/src/app/index.ts b/src/app/index.ts index b048c6a6..df5bdfab 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -125,10 +125,10 @@ export const renderNote = (note, {showEntire = false}) => { } export const asDisplayEvent = event => - ({children: [], replies: [], reactions: [], ...event}) + ({children: [], replies: [], reactions: [], ...event}) as DisplayEvent export const mergeParents = (notes: Array) => { - const notesById = createMap('id', notes) + const notesById = createMap('id', notes) as Record const childIds = [] for (const note of Object.values(notesById)) { @@ -140,7 +140,7 @@ export const mergeParents = (notes: Array) => { // Add the current note to its parents children, but only if we found a parent if (notesById[parentId]) { - notesById[parentId].children = notesById[parentId].children.concat(note) + notesById[parentId].children = notesById[parentId].children.concat([note]) } } diff --git a/src/util/types.ts b/src/util/types.ts index 607ffa34..4670a2ae 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -18,7 +18,7 @@ export type MyEvent = Event & { } export type DisplayEvent = MyEvent & { - replies: [] - reactions: [] - children: [] + replies: Array + reactions: Array + children: Array }