Skip to content

Commit 17ea98f

Browse files
committed
feat: add endpoint to resolve leaf handles.
1 parent 4f176f1 commit 17ea98f

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

atproto-handle-resolver/main.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AutoRouter, cors, error } from "itty-router";
22
import { AtprotoHandleResolver } from "@atproto-labs/handle-resolver";
33

4-
const resolver = new AtprotoHandleResolver({
4+
const atprotoResolver = new AtprotoHandleResolver({
55
async resolveTxt(hostname) {
66
try {
77
return (await Deno.resolveDns(hostname, "TXT")).flat();
@@ -22,9 +22,30 @@ router.get("/xrpc/com.atproto.identity.resolveHandle", async ({ query }) => {
2222
const { handle } = query;
2323
if (typeof handle !== "string" || !handle)
2424
return error(400, "handle query parameter required");
25-
const did: string | null = await resolver.resolve(handle);
25+
const did: string | null = await atprotoResolver.resolve(handle);
2626
if (!did) return error(404, `Could not resolve handle to DID: ${handle}`);
2727
return { did };
2828
});
2929

30+
router.get("/xrpc/town.muni.leaf.resolveHandle", async ({ query }) => {
31+
const { handle } = query;
32+
if (typeof handle !== "string" || !handle)
33+
return error(400, "handle query parameter required");
34+
35+
const txtRecords = (await Deno.resolveDns(`_leaf.${handle}`, "TXT"))
36+
.flat()
37+
.flatMap((x) => {
38+
const split = x.split("=");
39+
if (split.length == 2) {
40+
const [key, value] = split;
41+
return [{ key, value }];
42+
}
43+
return [];
44+
});
45+
const did: string | undefined = txtRecords.find((x) => x.key == "did")?.value;
46+
if (!did || !did.startsWith("did:"))
47+
return error(404, `Could not resolve handle to DID: ${handle}`);
48+
return { did };
49+
});
50+
3051
Deno.serve(router.fetch);

0 commit comments

Comments
 (0)