From 8c7a27d7c6c6344d6ca37fcedf17ff05de45cac2 Mon Sep 17 00:00:00 2001 From: "Jill \"oatmealine\" Monoids" Date: Sat, 17 Feb 2024 14:22:50 +0300 Subject: [PATCH] metadata garbage collection --- index.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index eb00175..89f0234 100644 --- a/index.js +++ b/index.js @@ -20,6 +20,10 @@ let levels = { metadata: [], }; +function getAllLevels() { + return [...levels.nlw.regular, ...levels.nlw.platformer, ...levels.nlw.pending, ...levels.ids.regular]; +} + async function exists(f) { try { await fs.stat(f); @@ -89,6 +93,7 @@ const metadataFetchQueue = new PQueue({ concurrency: 10, interval: 500, interval metadataFetchQueue.on('empty', async () => { console.log('metadata fetch queue empty, idling'); await metadataSanityCheck(); + await metadataGarbageCollect(); }); // hopefully will prevent cross-sheet duplicate fighting @@ -106,7 +111,7 @@ function getMetadata(level) { } async function loadupMetadataQueue() { - const list = [...levels.nlw.regular, ...levels.nlw.platformer, ...levels.nlw.pending, ...levels.ids.regular]; + const list = getAllLevels(); const noMetadata = list.filter(l => getMetadata(l) === undefined); if (noMetadata.length === 0) { @@ -160,6 +165,20 @@ async function metadataSanityCheck() { } } +async function metadataGarbageCollect() { + const metadata = []; + for (const level of getAllLevels()) { + const data = getMetadata(level); + if (data && metadata.findIndex(m => m.name === data.name && m.creator === data.creator) === -1) metadata.push(data); + } + + if (metadata.length < levels.metadata.length) { + console.log(`garbage collecting metadata (${levels.metadata.length - metadata.length} levels)`); + levels.metadata = levels.metadata.filter(m => metadata.indexOf(m) !== -1); + await saveCache(); + } +} + await loadCache(); //await loadupMetadataQueue();