From 675db25af828ef3eb66ee74577f8c679b162f867 Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Mon, 13 Feb 2023 18:04:26 -0600 Subject: [PATCH] Batch synchronization to worker --- src/agent/database.ts | 17 ++++++----------- src/agent/workers/database.js | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/agent/database.ts b/src/agent/database.ts index 66e604a4..ff6af9d1 100644 --- a/src/agent/database.ts +++ b/src/agent/database.ts @@ -82,7 +82,9 @@ const callLocalforage = async (storeName, method, ...args) => { const getItem = (storeName, ...args) => callLocalforage(storeName, 'getItem', ...args) const setItem = (storeName, ...args) => callLocalforage(storeName, 'setItem', ...args) +const setItems = (storeName, ...args) => callLocalforage(storeName, 'setItems', ...args) const removeItem = (storeName, ...args) => callLocalforage(storeName, 'removeItem', ...args) +const removeItems = (storeName, ...args) => callLocalforage(storeName, 'removeItems', ...args) const length = storeName => callLocalforage(storeName, 'length') const clear = storeName => callLocalforage(storeName, 'clear') @@ -181,14 +183,7 @@ const defineTable = (name: string, pk: string, opts: TableOpts = {}): Table => { setAndNotify({...data, ...newData}) // Sync to storage, keeping updates in order - p = p.then(() => { - const updates = [] - for (const [k, v] of Object.entries(newData)) { - updates.push(setItem(name, k, v)) - } - - return Promise.all(updates) - }) as Promise + p = p.then(() => setItems(name, newData)) as Promise } const bulkPatch = (updates: Record): void => { @@ -314,7 +309,7 @@ const clearAll = () => Promise.all(Object.keys(registry).map(clear)) const ready = derived(pluck('ready', Object.values(registry)), all(identity)) export default { - getItem, setItem, removeItem, length, clear, keys, iterate, watch, - getPersonWithFallback, clearAll, people, rooms, messages, alerts, relays, - routes, ready, + getItem, setItem, setItems, removeItem, removeItems, length, clear, keys, + 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 72f95a12..67e3f045 100644 --- a/src/agent/workers/database.js +++ b/src/agent/workers/database.js @@ -24,7 +24,21 @@ addEventListener('message', async ({data: {topic, payload, channel}}) => { switcherFn(topic, { 'localforage.call': async () => { const {storeName, method, args} = payload - const result = await getStore(storeName)[method](...args) + const instance = getStore(storeName) + + const result = await switcherFn(method, { + 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) + } + }, + default: () => instance[method](...args), + }) reply('localforage.return', result) },