From 1ce00bd3b6909f78f212a7a172cf845b55280599 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 19 Jul 2021 08:28:14 -0300 Subject: [PATCH] nip05. --- nip05.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 nip05.js diff --git a/nip05.js b/nip05.js new file mode 100644 index 0000000..39d2986 --- /dev/null +++ b/nip05.js @@ -0,0 +1,51 @@ +import dnsPacket from 'dns-packet' + +const dohProviders = [ + 'cloudflare-dns.com', + 'fi.doh.dns.snopyta.org', + 'basic.bravedns.com', + 'hydra.plan9-ns1.com', + 'doh.pl.ahadns.net', + 'dns.flatuslifir.is', + 'doh.dns.sb', + 'doh.li' +] + +let counter = 0 + +export async function keyFromDomain(domain) { + let host = dohProviders[counter % dohProviders.length] + + let buf = dnsPacket.encode({ + type: 'query', + id: Math.floor(Math.random() * 65534), + flags: dnsPacket.RECURSION_DESIRED, + questions: [ + { + type: 'TXT', + name: `_nostrkey.${domain}` + } + ] + }) + + let fetching = fetch(`https://${host}/dns-query`, { + method: 'POST', + headers: { + 'Content-Type': 'application/dns-message', + 'Content-Length': Buffer.byteLength(buf) + }, + body: buf + }) + + counter++ + + try { + let response = Buffer.from(await (await fetching).arrayBuffer()) + let {answers} = dnsPacket.decode(response) + if (answers.length === 0) return null + return Buffer.from(answers[0].data[0]).toString() + } catch (err) { + console.log(`error querying DNS for ${domain} on ${host}`, err) + return null + } +} diff --git a/package.json b/package.json index 6513283..24eea1d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nostr-tools", - "version": "0.4.6", + "version": "0.5.0", "description": "Tools for making a Nostr client.", "main": "index.js", "repository": { @@ -9,6 +9,7 @@ }, "dependencies": { "buffer": "^6.0.3", + "dns-packet": "^5.2.4", "noble-secp256k1": "^1.1.1", "websocket-polyfill": "^0.0.3" },