personal web client for Bluesky
typescript
solidjs
bluesky
atcute
1import { ComAtprotoIdentityResolveDid, ComAtprotoIdentityResolveHandle } from '@atcute/atproto';
2import {
3 AmbiguousHandleError,
4 CompositeDidDocumentResolver,
5 CompositeHandleResolver,
6 DidNotFoundError,
7 DocumentNotFoundError,
8 DohJsonHandleResolver,
9 ImproperDidError,
10 InvalidResolvedHandleError,
11 PlcDidDocumentResolver,
12 UnsupportedDidMethodError,
13 WebDidDocumentResolver,
14 WellKnownHandleResolver,
15} from '@atcute/identity-resolver';
16import { InvalidRequestError, XRPCRouter, json } from '@atcute/xrpc-server';
17
18const handleResolver = new CompositeHandleResolver({
19 methods: {
20 dns: new DohJsonHandleResolver({ dohUrl: 'https://mozilla.cloudflare-dns.com/dns-query' }),
21 http: new WellKnownHandleResolver(),
22 },
23});
24
25const didDocResolver = new CompositeDidDocumentResolver<string>({
26 methods: {
27 plc: new PlcDidDocumentResolver(),
28 web: new WebDidDocumentResolver(),
29 },
30});
31
32const router = new XRPCRouter();
33
34router.add(ComAtprotoIdentityResolveHandle.mainSchema, {
35 async handler({ params: { handle } }) {
36 try {
37 const did = await handleResolver.resolve(handle);
38
39 return json({ did });
40 } catch (err) {
41 console.error(`resolveHandleToDid`, handle, err);
42
43 if (err instanceof DidNotFoundError) {
44 throw new InvalidRequestError({ description: `no did found under that handle` });
45 }
46
47 if (err instanceof InvalidResolvedHandleError) {
48 throw new InvalidRequestError({ description: `did found but is invalid atproto did` });
49 }
50
51 if (err instanceof AmbiguousHandleError) {
52 throw new InvalidRequestError({ description: `multiple did found under that handle` });
53 }
54
55 throw err;
56 }
57 },
58});
59
60router.add(ComAtprotoIdentityResolveDid.mainSchema, {
61 async handler({ params: { did } }) {
62 try {
63 const doc = await didDocResolver.resolve(did);
64
65 return json({ didDoc: doc as unknown as Record<string, unknown> });
66 } catch (err) {
67 console.error(`resolveDidToDoc`, did, err);
68
69 if (err instanceof DocumentNotFoundError) {
70 throw new InvalidRequestError({ description: `no document found under that did` });
71 }
72
73 if (err instanceof UnsupportedDidMethodError) {
74 throw new InvalidRequestError({ description: `unsupported did method` });
75 }
76
77 if (err instanceof ImproperDidError) {
78 throw new InvalidRequestError({ description: `invalid did` });
79 }
80
81 throw err;
82 }
83 },
84});
85
86export default { fetch: router.fetch } satisfies ExportedHandler<Env>;