import { logger as rootLogger } from '../logger.js'; import { getIdentityResolver, resolvePdsEndpointCached, resolvePdsHostCached } from './identity.js'; const logger = rootLogger.child({ module: 'pds-provider' }); export interface PdsProviderInfo { name: string; host: string; } const KNOWN_PDS_HOSTS: { pattern: RegExp; name: string }[] = [ { pattern: /\.bsky\.network$/i, name: 'bluesky' }, { pattern: /^bsky\.social$/i, name: 'bluesky' }, { pattern: /\.blacksky\.app$/i, name: 'blacksky' }, { pattern: /^blacksky\.app$/i, name: 'blacksky' }, { pattern: /\.eurosky\.social$/i, name: 'eurosky' }, { pattern: /^eurosky\.social$/i, name: 'eurosky' }, { pattern: /\.northsky\.social$/i, name: 'northsky' }, { pattern: /^northsky\.social$/i, name: 'northsky' }, { pattern: /\.selfhosted\.social$/i, name: 'selfhosted-social' }, { pattern: /^selfhosted\.social$/i, name: 'selfhosted-social' }, ]; export function mapPdsHostToProvider(host: string): PdsProviderInfo { for (const entry of KNOWN_PDS_HOSTS) { if (entry.pattern.test(host)) { return { name: entry.name, host }; } } return { name: 'selfhosted', host }; } export function extractPdsHostFromEndpoint(endpoint: string): string | null { try { return new URL(endpoint).hostname; } catch { return null; } } /** * Resolves the full PDS endpoint URL (e.g. "https://maitake.us-west.host.bsky.network") * from a DID. Uses the cached IdentityResolver if available, falls back to * direct plc.directory fetch for standalone/test usage. */ export async function resolvePdsEndpoint(did: string): Promise { const resolver = getIdentityResolver(); if (resolver) { return resolvePdsEndpointCached(resolver, did); } logger.warn({ did }, 'IdentityResolver not initialized, skipping PDS resolution'); return null; } /** * Resolves the PDS hostname from a DID. * Uses the cached IdentityResolver if available. */ export async function resolvePdsHost(did: string): Promise { const resolver = getIdentityResolver(); if (resolver) { return resolvePdsHostCached(resolver, did); } logger.warn({ did }, 'IdentityResolver not initialized, skipping PDS host resolution'); return null; }