1import { IdResolver, MemoryCache } from "@atproto/identity";
2
3const HOUR = 60e3 * 60;
4const DAY = HOUR * 24;
5
6export function createIdResolver() {
7 return new IdResolver({
8 didCache: new MemoryCache(HOUR, DAY),
9 });
10}
11
12export interface BidirectionalResolver {
13 resolveDidToHandle(did: string): Promise<string>;
14 resolveDidsToHandles(dids: string[]): Promise<Record<string, string>>;
15}
16
17export function createBidirectionalResolver(resolver: IdResolver) {
18 return {
19 async resolveDidToHandle(did: string): Promise<string> {
20 const didDoc = await resolver.did.resolveAtprotoData(did);
21 const resolvedHandle = await resolver.handle.resolve(didDoc.handle);
22 if (resolvedHandle === did) {
23 return didDoc.handle;
24 }
25 return did;
26 },
27
28 async resolveDidsToHandles(
29 dids: string[],
30 ): Promise<Record<string, string>> {
31 const didHandleMap: Record<string, string> = {};
32 const resolves = await Promise.all(
33 dids.map((did) => this.resolveDidToHandle(did).catch((_) => did)),
34 );
35 for (let i = 0; i < dids.length; i++) {
36 didHandleMap[dids[i]] = resolves[i];
37 }
38 return didHandleMap;
39 },
40 };
41}