From ebe57e4810b003628ac947d6381dd03b70f58cd8 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Tue, 11 Jun 2024 11:01:03 -0300 Subject: client: factor out some search logic Was trying to address a bug that is already handled just by making sure the generated search is up to date w/ search-spec lol --- src/static/js/search-worker.js | 86 +++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/static/js/search-worker.js b/src/static/js/search-worker.js index 5c7f43f6..8e83fe02 100644 --- a/src/static/js/search-worker.js +++ b/src/static/js/search-worker.js @@ -141,38 +141,18 @@ function rebase(path) { return `/search-data/` + path; } -async function main() { - let background; - - background = - Promise.all([ - fetch(rebase('index.json')) - .then(resp => resp.json()), - - loadCachedIndexFromIDB(), - ]); - - indexes = - withEntries(searchSpec, entries => entries - .map(([key, descriptor]) => [ - key, - makeSearchIndex(descriptor, {FlexSearch}), - ])); - - const [indexData, idbIndexData] = await background; - - const keysNeedingFetch = - (idbIndexData - ? Object.keys(indexData) - .filter(key => - indexData[key].md5 !== - idbIndexData[key]?.md5) - : Object.keys(indexData)); - - const keysFromCache = - Object.keys(indexData) - .filter(key => !keysNeedingFetch.includes(key)) +async function prepareIndexData() { + return Promise.all([ + fetch(rebase('index.json')) + .then(resp => resp.json()), + + loadCachedIndexFromIDB(), + ]).then( + ([indexData, idbIndexData]) => + ({indexData, idbIndexData})); +} +function fetchIndexes(keysNeedingFetch) { if (!empty(keysNeedingFetch)) { postMessage({ kind: 'download-begun', @@ -181,7 +161,7 @@ async function main() { }); } - const fetchPromises = + return ( keysNeedingFetch.map(key => fetchWithProgress( rebase(key + '.json.msgpack'), @@ -200,7 +180,41 @@ async function main() { }); return response; - })); + }))); +} + +async function main() { + const prepareIndexDataPromise = prepareIndexData(); + + indexes = + withEntries(searchSpec, entries => entries + .map(([key, descriptor]) => [ + key, + makeSearchIndex(descriptor, {FlexSearch}), + ])); + + const {indexData, idbIndexData} = await prepareIndexDataPromise; + + const keysNeedingFetch = + (idbIndexData + ? Object.keys(indexData) + .filter(key => + indexData[key].md5 !== + idbIndexData[key]?.md5) + : Object.keys(indexData)); + + const keysFromCache = + Object.keys(indexData) + .filter(key => !keysNeedingFetch.includes(key)) + + const cacheArrayBufferPromises = + keysFromCache + .map(key => idbIndexData[key]) + .map(({cachedBinarySource}) => + cachedBinarySource.arrayBuffer()); + + const fetchPromises = + fetchIndexes(keysNeedingFetch); const fetchBlobPromises = fetchPromises @@ -212,12 +226,6 @@ async function main() { .map(promise => promise .then(blob => blob.arrayBuffer())); - const cacheArrayBufferPromises = - keysFromCache - .map(key => idbIndexData[key]) - .map(({cachedBinarySource}) => - cachedBinarySource.arrayBuffer()); - function arrayBufferToJSON(data) { data = new Uint8Array(data); data = unpack(data); -- cgit 1.3.0-6-gf8a5