From a19f1aa6e8c166b523c69e54a7d407a0d550da8f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 27 Mar 2024 19:45:03 -0500 Subject: [PATCH] NIP05 DRYer --- src/controllers/well-known/nostr.ts | 21 +++++---------------- src/utils/nip05.ts | 26 ++++++++++++++------------ 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/controllers/well-known/nostr.ts b/src/controllers/well-known/nostr.ts index 049e5cd..7c812c7 100644 --- a/src/controllers/well-known/nostr.ts +++ b/src/controllers/well-known/nostr.ts @@ -1,7 +1,6 @@ import { AppController } from '@/app.ts'; -import { Conf } from '@/config.ts'; import { z } from '@/deps.ts'; -import { eventsDB } from '@/storages.ts'; +import { localNip05Lookup } from '@/utils/nip05.ts'; const nameSchema = z.string().min(1).regex(/^\w+$/); @@ -12,30 +11,20 @@ const nameSchema = z.string().min(1).regex(/^\w+$/); const nostrController: AppController = async (c) => { const result = nameSchema.safeParse(c.req.query('name')); const name = result.success ? result.data : undefined; + const pointer = name ? await localNip05Lookup(name) : undefined; - if (!name) { + if (!name || !pointer) { return c.json({ names: {}, relays: {} }); } - const [label] = await eventsDB.query([{ - kinds: [1985], - authors: [Conf.pubkey], - '#L': ['nip05'], - '#l': [`${name}@${Conf.url.host}`], - }]); - - const pubkey = label?.tags.find(([name]) => name === 'p')?.[1]; - - if (!label || !pubkey) { - return c.json({ names: {}, relays: {} }); - } + const { pubkey, relays } = pointer; return c.json({ names: { [name]: pubkey, }, relays: { - [pubkey]: [Conf.relay], + [pubkey]: relays, }, }); }; diff --git a/src/utils/nip05.ts b/src/utils/nip05.ts index c572b4d..c821c09 100644 --- a/src/utils/nip05.ts +++ b/src/utils/nip05.ts @@ -3,6 +3,7 @@ import { Debug, NIP05, nip19 } from '@/deps.ts'; import { SimpleLRU } from '@/utils/SimpleLRU.ts'; import { Time } from '@/utils/time.ts'; import { eventsDB } from '@/storages.ts'; +import { fetchWorker } from '@/workers/fetch.ts'; const debug = Debug('ditto:nip05'); @@ -12,9 +13,15 @@ const nip05Cache = new SimpleLRU( const [name, domain] = key.split('@'); try { if (domain === Conf.url.host) { - return localNip05Lookup(name); + const pointer = await localNip05Lookup(name); + if (pointer) { + debug(`Found: ${key} is ${pointer.pubkey}`); + return pointer; + } else { + throw new Error(`Not found: ${key}`); + } } else { - const result = await NIP05.lookup(key, { fetch, signal }); + const result = await NIP05.lookup(key, { fetch: fetchWorker, signal }); debug(`Found: ${key} is ${result.pubkey}`); return result; } @@ -23,28 +30,23 @@ const nip05Cache = new SimpleLRU( throw e; } }, - { max: 5000, ttl: Time.hours(1) }, + { max: 500, ttl: Time.hours(1) }, ); -async function localNip05Lookup(name: string): Promise { - const { host } = Conf.url; - +async function localNip05Lookup(name: string): Promise { const [label] = await eventsDB.query([{ kinds: [1985], authors: [Conf.pubkey], '#L': ['nip05'], - '#l': [`${name}@${host}`], + '#l': [`${name}@${Conf.url.host}`], + limit: 1, }]); const pubkey = label?.tags.find(([name]) => name === 'p')?.[1]; if (pubkey) { - debug(`Found: ${name} is ${pubkey}`); return { pubkey, relays: [Conf.relay] }; } - - debug(`Not found: ${name}`); - throw new Error('Not found'); } -export { nip05Cache }; +export { localNip05Lookup, nip05Cache };