extremely wip tangled spa
at main 1.8 kB view raw
1import { 2 CompositeDidDocumentResolver, 3 CompositeHandleResolver, 4 DohJsonHandleResolver, 5 PlcDidDocumentResolver, 6 WebDidDocumentResolver, 7 WellKnownHandleResolver, 8} from "@atcute/identity-resolver"; 9import { query } from "@solidjs/router"; 10import { slingshotUrl } from "./microcosm"; 11import type { DID } from "./types"; 12 13const useSlingshot: boolean = true; 14 15const didMap = new Map<string, DID>(); 16 17const handleResolver = new CompositeHandleResolver({ 18 strategy: "race", 19 methods: { 20 dns: new DohJsonHandleResolver({ 21 dohUrl: "https://mozilla.cloudflare-dns.com/dns-query", 22 }), 23 http: new WellKnownHandleResolver(), 24 }, 25}); 26 27const docResolver = new CompositeDidDocumentResolver({ 28 methods: { 29 plc: new PlcDidDocumentResolver(), 30 web: new WebDidDocumentResolver(), 31 }, 32}); 33 34export const figureOutDid = query(async (handle: string): Promise<DID> => { 35 const isDid = handle.startsWith("did:"); 36 if (!isDid && handle.includes(".")) { 37 let did = didMap.get(handle); 38 // if (!did && useSlingshot) { 39 // const res = await fetch( 40 // `${slingshotUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${handle}`, 41 // ); 42 // if (res.ok) { 43 // const json = await res.json(); 44 // if ("did" in json && typeof json.did === "string") did = json.did; 45 // } 46 // } 47 if (!did) { 48 try { 49 did = await handleResolver.resolve(handle as `${string}.${string}`); 50 } catch { 51 did = "did:plc:fail"; 52 } 53 } 54 didMap.set(handle, did); 55 return did; 56 } 57 return handle as DID; 58}, "did"); 59 60export const figureOutHandle = query(async (did: DID): Promise<string> => { 61 try { 62 const doc = await docResolver.resolve(did); 63 if (doc.alsoKnownAs?.[0]) { 64 const handle = doc.alsoKnownAs[0].replace("at://", ""); 65 didMap.set(handle, did); 66 return handle; 67 } 68 } catch {} 69 return did; 70}, "handles");