diff --git a/scripts/db-populate-nip05.ts b/scripts/db-populate-nip05.ts index c22c0c12..48e792f6 100644 --- a/scripts/db-populate-nip05.ts +++ b/scripts/db-populate-nip05.ts @@ -1,3 +1,4 @@ +import { Semaphore } from '@lambdalisue/async'; import { NSchema as n } from '@nostrify/nostrify'; import { Storages } from '@/storages.ts'; @@ -5,6 +6,7 @@ import { faviconCache } from '@/utils/favicon.ts'; import { nip05Cache } from '@/utils/nip05.ts'; const kysely = await Storages.kysely(); +const sem = new Semaphore(5); const query = kysely .selectFrom('nostr_events') @@ -12,31 +14,37 @@ const query = kysely .where('kind', '=', 0); for await (const { content } of query.stream(100)) { - const signal = AbortSignal.timeout(30_000); // generous timeout - - // Parse metadata. - const metadata = n.json().pipe(n.metadata()).catch({}).safeParse(content); - if (!metadata.success) continue; - - // Update nip05. - const { nip05 } = metadata.data; - if (nip05) { - try { - await nip05Cache.fetch(nip05, { signal }); - } catch { - // Ignore. - } + while (sem.locked) { + await new Promise((resolve) => setTimeout(resolve, 0)); } - // Update favicon. - const domain = nip05?.split('@')[1].toLowerCase(); - if (domain) { - try { - await faviconCache.fetch(domain, { signal }); - } catch { - // Ignore. + sem.lock(async () => { + const signal = AbortSignal.timeout(30_000); // generous timeout + + // Parse metadata. + const metadata = n.json().pipe(n.metadata()).catch({}).safeParse(content); + if (!metadata.success) return; + + // Update nip05. + const { nip05 } = metadata.data; + if (nip05) { + try { + await nip05Cache.fetch(nip05, { signal }); + } catch { + // Ignore. + } } - } + + // Update favicon. + const domain = nip05?.split('@')[1].toLowerCase(); + if (domain) { + try { + await faviconCache.fetch(domain, { signal }); + } catch { + // Ignore. + } + } + }); } Deno.exit();