video.cerulea.blue/common/identity.ts
Charlotte Som 89ec573591 ssr for video viewer
this lets us send opengraph tags in the response :D
might make the player also be server-side rendered as well
2026-03-10 23:39:04 +00:00

32 lines
1.2 KiB
TypeScript

import type { DidDocument } from "@atcute/identity";
import type { ATProtoUniverse } from "@char/lexicon.ts/atproto";
import { XRPC } from "@char/lexicon.ts/rpc";
const bskyPublic = new XRPC<ATProtoUniverse>("https://public.api.bsky.app");
export async function resolveHandle(handle: string): Promise<`did:${string}`> {
const { did } = await bskyPublic.get("com.atproto.identity.resolveHandle", {
params: { handle },
});
return did;
}
export async function resolveDid(did: string): Promise<DidDocument> {
if (did.startsWith("did:plc:")) {
const doc = await fetch("https://plc.directory/" + did).then(r => r.json());
return doc;
} else if (did.startsWith("did:web:")) {
// TODO: write our own did:web resolver (maybe use a CORS proxy on clientside)
const { WebDidDocumentResolver } = await import("@atcute/identity-resolver");
const resolver = new WebDidDocumentResolver();
return resolver.resolve(did as `did:web:${string}`);
}
throw new Error("unsupported did type: " + did);
}
export async function getPdsUrl(did: string): Promise<string | null> {
const doc = await resolveDid(did);
const url = doc.service?.find((it) => it.id === "#atproto_pds")?.serviceEndpoint;
return typeof url === "string" ? url : null;
}