import type { } from "@atcute/atproto" import type { } from "@atcute/bluesky" import { Client, CredentialManager } from "@atcute/client" import { isAtprotoDid } from "@atcute/identity"; import { CompositeDidDocumentResolver, DocumentNotFoundError, FailedDocumentResolutionError, HandleResolutionError, ImproperDidError, PlcDidDocumentResolver, UnsupportedDidMethodError, WebDidDocumentResolver } from "@atcute/identity-resolver"; import { tryCatch } from "./utils"; type DID = `did:${string}:${string}` const pds = location.protocol === "https:" ? location.origin : "https://pds.finxol.io" export async function getUsers() { const rpc = new Client({ handler: new CredentialManager({ service: pds }), }) const r = await rpc.get("com.atproto.sync.listRepos", { params: { limit: 100, cursor: "" }, // I don't have that many users so I'll implement the cursor later if needed }) if (!r.ok) { console.error("Failed to fetch users list:", r.data) return [] } return r.data.repos } export async function resolveAliases(did: DID) { // DID document resolution const docResolver = new CompositeDidDocumentResolver({ methods: { plc: new PlcDidDocumentResolver(), web: new WebDidDocumentResolver(), }, }); if (!isAtprotoDid(did)) { return } const doc = await tryCatch(docResolver.resolve(did)); if (!doc.success) { if (doc.error instanceof DocumentNotFoundError) { // did returned no document console.error("Document not found"); } if (doc.error instanceof UnsupportedDidMethodError) { // resolver doesn't support did method (composite resolver) console.error("Unsupported DID method"); } if (doc.error instanceof ImproperDidError) { // resolver considers did as invalid (atproto did:web) console.error("Improper DID"); } if (doc.error instanceof FailedDocumentResolutionError) { // document resolution had thrown something unexpected (fetch error) console.error("Failed document resolution"); } if (doc.error instanceof HandleResolutionError) { // the errors above extend this class, so you can do a catch-all. console.error("Handle resolution error"); } return } return doc.value.alsoKnownAs; } export async function getAvatar(did: DID) { const rpc = new Client({ handler: new CredentialManager({ service: "https://public.api.bsky.app" }), }) const res = await rpc.get("app.bsky.actor.getProfile", { params: { actor: did } }); if (res.ok) { return res.data.avatar; } return undefined; }