11import { AutoRouter , cors , error } from "itty-router" ;
22import { 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+
3051Deno . serve ( router . fetch ) ;
0 commit comments