import { IdResolver, getPds } from "@atproto/identity"; export type Record = { uri: string; cid: string; value: unknown; }; export async function getRecord( did: string, collection: string, rkey: string, ): Promise<{ uri: string; cid: string; value: T } | null> { const pds = await resolvePds(did); if (!pds) return null; const url = new URL(`${pds}/xrpc/com.atproto.repo.getRecord`); url.searchParams.set("repo", did); url.searchParams.set("collection", collection); url.searchParams.set("rkey", rkey); const res = await fetch(url); if (!res.ok) return null; return (await res.json()) as { uri: string; cid: string; value: T }; } export async function listAllRecords( did: string, collection: string, ): Promise<{ value: any; uri: string }[]> { const pds = await resolvePds(did); if (!pds) return []; const records: Record[] = []; let cursor: string | undefined; do { const url = new URL(`${pds}/xrpc/com.atproto.repo.listRecords`); url.searchParams.set("repo", did); url.searchParams.set("collection", collection); url.searchParams.set("limit", "100"); if (cursor) url.searchParams.set("cursor", cursor); const res = (await (await fetch(url)).json()) as { records?: Record[]; cursor?: string; }; records.push(...(res.records || [])); cursor = res.cursor; } while (cursor); return records; } async function resolvePds(did: string): Promise { const resolver = new IdResolver(); const doc = await resolver.did.resolve(did); if (!doc) return null; return getPds(doc) ?? null; }