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");