Scrapboard.org client
1import { Agent } from "@atproto/api";
2import { DidCache } from "../stores/did";
3import { PLC_DIRECTORY } from "@/constants";
4import {
5 CompositeDidDocumentResolver,
6 PlcDidDocumentResolver,
7 WebDidDocumentResolver,
8} from "@atcute/identity-resolver";
9import { Did } from "@atcute/lexicons";
10
11export async function getPdsAgent(
12 did: string | null,
13 didStore: DidCache,
14 defaultAgent: Agent
15) {
16 const docResolver = new CompositeDidDocumentResolver({
17 methods: {
18 plc: new PlcDidDocumentResolver(),
19 web: new WebDidDocumentResolver(),
20 },
21 });
22
23 if (!did) {
24 return defaultAgent;
25 } else {
26 let didDoc = didStore.getDid(did);
27 if (!didDoc) {
28 const doc = await docResolver.resolve(did as Did<"plc">);
29 didDoc = didStore.setDid(did, doc);
30 }
31
32 if (!didDoc?.doc?.service)
33 throw Error("DID document doesn't include 'service'");
34 const pdsUrl = didDoc?.doc?.service.filter((e) => e.id == "#atproto_pds")[0]
35 .serviceEndpoint;
36
37 if (!pdsUrl) throw Error("DID doesn't include atproto");
38 if (typeof pdsUrl != "string")
39 throw Error("'#atproto_pds' service endpoint isn't a string");
40
41 return new Agent({ service: pdsUrl });
42 }
43}