import type { DIDResolutionOptions, DIDResolutionResult, DIDResolver, ParsedDID, Resolvable, } from "did-resolver"; import { DID_LD_JSON, SUPPORTED_CONTENT_TYPES } from "./constants.ts"; import { DidResolutionError, RepresentationNotSupportedError, } from "./errors/index.ts"; import { resolveDidDoc } from "./internals.ts"; /** * DID Resolver for Natural Persons (did:key method) * @returns A record mapping the "key" method with the resolver. */ export function getResolver(): Record<"key", DIDResolver> { return { key: resolve }; } function resolve( did: string, _: ParsedDID, __: Resolvable, didResolutionOptions?: DIDResolutionOptions, ): Promise { try { const contentType = didResolutionOptions?.accept ?? DID_LD_JSON; if (!SUPPORTED_CONTENT_TYPES.includes(contentType)) { throw new RepresentationNotSupportedError( `Representation "${contentType}" is not supported`, ); } const didDocument = resolveDidDoc(did, contentType); return Promise.resolve({ didDocument, didDocumentMetadata: {}, didResolutionMetadata: { contentType }, }); } catch (error) { if (error instanceof DidResolutionError) { return Promise.resolve({ // eslint-disable-next-line unicorn/no-null didDocument: null, didDocumentMetadata: {}, didResolutionMetadata: { error: error.code, message: error.message, }, }); } const message = error instanceof Error ? error.message : "Unknown error"; return Promise.resolve({ // eslint-disable-next-line unicorn/no-null didDocument: null, didDocumentMetadata: {}, didResolutionMetadata: { error: "invalidDid", message, }, }); } }