Scratch space for learning atproto app development

Restore id-resolver

Changed files
+49 -16
src
+7 -2
src/context.ts
···
import { createDb, Database, migrateToLatest } from '#/db'
import { createIngester } from '#/ingester'
import { env } from '#/env'
/**
* Application state passed to the router and elsewhere
···
ingester: Firehose
logger: pino.Logger
oauthClient: NodeOAuthClient
-
identityResolver: NodeOAuthClient['identityResolver']
}
export async function createAppContext(): Promise<AppContext> {
···
const oauthClient = await createOAuthClient(db)
const ingester = createIngester(db)
const logger = pino({ name: 'server', level: env.LOG_LEVEL })
return {
db,
ingester,
logger,
oauthClient,
-
identityResolver: oauthClient.identityResolver,
}
}
···
import { createDb, Database, migrateToLatest } from '#/db'
import { createIngester } from '#/ingester'
import { env } from '#/env'
+
import {
+
BidirectionalResolver,
+
createBidirectionalResolver,
+
} from '#/id-resolver'
/**
* Application state passed to the router and elsewhere
···
ingester: Firehose
logger: pino.Logger
oauthClient: NodeOAuthClient
+
resolver: BidirectionalResolver
}
export async function createAppContext(): Promise<AppContext> {
···
const oauthClient = await createOAuthClient(db)
const ingester = createIngester(db)
const logger = pino({ name: 'server', level: env.LOG_LEVEL })
+
const resolver = createBidirectionalResolver(oauthClient)
return {
db,
ingester,
logger,
oauthClient,
+
resolver,
}
}
+38
src/id-resolver.ts
···
···
+
import { OAuthClient } from '@atproto/oauth-client-node'
+
+
export interface BidirectionalResolver {
+
resolveDidToHandle(did: string): Promise<string>
+
resolveDidsToHandles(
+
dids: string[],
+
): Promise<Record<string, string | undefined>>
+
}
+
+
export function createBidirectionalResolver({
+
identityResolver,
+
}: OAuthClient): BidirectionalResolver {
+
return {
+
async resolveDidToHandle(did: string): Promise<string> {
+
try {
+
const { handle } = await identityResolver.resolve(did)
+
if (handle) return handle
+
} catch {
+
// Ignore
+
}
+
return did
+
},
+
+
async resolveDidsToHandles(
+
dids: string[],
+
): Promise<Record<string, string | undefined>> {
+
const uniqueDids = [...new Set(dids)]
+
+
return Object.fromEntries(
+
await Promise.all(
+
uniqueDids.map((did) =>
+
this.resolveDidToHandle(did).then((handle) => [did, handle]),
+
),
+
),
+
)
+
},
+
}
+
}
+4 -14
src/routes.ts
···
.executeTakeFirst()
: undefined
-
// Map (unique) user DIDs to their domain-name handles
-
const uniqueDids = [...new Set(statuses.map((s) => s.authorDid))]
-
-
const didHandleMap: Record<string, string | undefined> =
-
Object.fromEntries(
-
await Promise.all(
-
uniqueDids.map((did) =>
-
ctx.identityResolver.resolve(did).then(
-
(r) => [did, r.handle],
-
() => [did, undefined],
-
),
-
),
-
),
-
)
if (!agent) {
// Serve the logged-out view
···
.executeTakeFirst()
: undefined
+
// Map user DIDs to their domain-name handles
+
const didHandleMap = await ctx.resolver.resolveDidsToHandles(
+
statuses.map((s) => s.authorDid),
+
)
if (!agent) {
// Serve the logged-out view