@skyware/labeler
Version:
A lightweight alternative to Ozone for operating an atproto labeler.
48 lines (47 loc) • 1.41 kB
JavaScript
import dns from "dns/promises";
export async function resolveHandle(handle) {
const dnsPromise = resolveDns(handle);
const httpAbort = new AbortController();
const httpPromise = resolveHttp(handle, httpAbort.signal).catch(() => undefined);
const dnsRes = await dnsPromise;
if (dnsRes) {
httpAbort.abort();
return dnsRes;
}
const res = await httpPromise;
if (res) {
return res;
}
}
async function resolveDns(handle) {
let chunkedResults;
try {
chunkedResults = await dns.resolveTxt(`_atproto.${handle}`);
}
catch (err) {
return undefined;
}
return parseDnsResult(chunkedResults);
}
async function resolveHttp(handle, signal) {
const url = new URL("/.well-known/atproto-did", `https://${handle}`);
try {
const res = await fetch(url, signal ? { signal } : undefined);
const did = (await res.text()).split("\n")[0].trim();
if (typeof did === "string" && did.startsWith("did:")) {
return did;
}
return undefined;
}
catch (err) {
return undefined;
}
}
function parseDnsResult(chunkedResults) {
const results = chunkedResults.map((chunks) => chunks.join(""));
const found = results.filter((i) => i.startsWith("did="));
if (found.length !== 1) {
return undefined;
}
return found[0].slice("did=".length);
}