diff --git a/osv-local/src/db.ts b/osv-local/src/db.ts index ebabeec..fdec57a 100644 --- a/osv-local/src/db.ts +++ b/osv-local/src/db.ts @@ -116,7 +116,6 @@ export async function setLastSyncedAt(ecosystem: string, ts: string): Promise { diff --git a/osv-local/src/sync.ts b/osv-local/src/sync.ts index 89241f1..12041f1 100644 --- a/osv-local/src/sync.ts +++ b/osv-local/src/sync.ts @@ -334,12 +334,48 @@ async function getStaleEcosystems(ecosystems: string[]): Promise { return stale; } +// --------------------------------------------------------------------------- +// Hjelpefunksjon for begrenset parallellitet +// --------------------------------------------------------------------------- + +/** + * Kjører et sett med asynkrone oppgaver med maks `concurrency` parallelt. + * Trygt i Node.js — JavaScript er entrådet, så index-telleren er atomisk. + */ +async function runConcurrent( + tasks: (() => Promise)[], + concurrency: number +): Promise { + const results: T[] = new Array(tasks.length); + let index = 0; + + async function worker(): Promise { + while (index < tasks.length) { + const i = index++; + results[i] = await tasks[i](); + } + } + + const workers = Array.from( + { length: Math.min(concurrency, tasks.length) }, + () => worker() + ); + await Promise.all(workers); + return results; +} + // --------------------------------------------------------------------------- // Synkronisering av økosystemer // --------------------------------------------------------------------------- async function syncEcosystems(ecosystems: string[]): Promise { - for (const eco of ecosystems) { + const concurrency = Math.max( + 1, + parseInt(process.env.OSV_LOCAL_SYNC_CONCURRENCY ?? "3", 10) + ); + log(`Synkroniserer ${ecosystems.length} økosystem(er) med maks ${concurrency} parallelt...`); + + const tasks = ecosystems.map((eco) => async () => { const lastSynced = await getLastSyncedAt(eco); const hasData = lastSynced && (await getVulnCountForEcosystem(eco)) > 0; @@ -360,7 +396,12 @@ async function syncEcosystems(ecosystems: string[]): Promise { ); } } - } + }); + + await runConcurrent(tasks, concurrency); + + // Lagre databasen til disk én gang etter at alle synker er ferdige + saveDb(); } // ---------------------------------------------------------------------------