UNPKG

did-resolver

Version:
1 lines 17.9 kB
{"version":3,"file":"resolver.cjs","sources":["../src/resolver.ts"],"sourcesContent":["// Copyright 2018 Consensys AG\n\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n\n// http://www.apache.org/licenses/LICENSE-2.0\n\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Defines an object type that can be extended with other properties.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Extensible = Record<string, any>\n\n/**\n * Defines the result of a DID resolution operation.\n *\n * @see {@link Resolvable.resolve}\n * @see {@link https://www.w3.org/TR/did-core/#did-resolution}\n */\nexport interface DIDResolutionResult {\n '@context'?: 'https://w3id.org/did-resolution/v1' | string | string[]\n didResolutionMetadata: DIDResolutionMetadata\n didDocument: DIDDocument | null\n didDocumentMetadata: DIDDocumentMetadata\n}\n\n/**\n * Describes the options forwarded to the resolver when executing a {@link Resolvable.resolve} operation.\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-resolution-options}\n */\nexport interface DIDResolutionOptions extends Extensible {\n accept?: string\n}\n\n/**\n * Encapsulates the resolution metadata resulting from a {@link Resolvable.resolve} operation.\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-resolution-metadata}\n */\nexport interface DIDResolutionMetadata extends Extensible {\n contentType?: string\n error?: 'invalidDid' | 'notFound' | 'representationNotSupported' | 'unsupportedDidMethod' | string\n}\n\n/**\n * Represents metadata about the DID document resulting from a {@link Resolvable.resolve} operation.\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-document-metadata}\n */\nexport interface DIDDocumentMetadata extends Extensible {\n created?: string\n updated?: string\n deactivated?: boolean\n versionId?: string\n nextUpdate?: string\n nextVersionId?: string\n equivalentId?: string\n canonicalId?: string\n}\n\n/**\n * Represents the Verification Relationship between a DID subject and a Verification Method.\n *\n * @see {@link https://www.w3.org/TR/did-core/#verification-relationships}\n */\nexport type KeyCapabilitySection =\n | 'authentication'\n | 'assertionMethod'\n | 'keyAgreement'\n | 'capabilityInvocation'\n | 'capabilityDelegation'\n\n/**\n * Represents a DID document.\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-document-properties}\n */\nexport type DIDDocument = {\n '@context'?: 'https://www.w3.org/ns/did/v1' | string | string[]\n id: string\n alsoKnownAs?: string[]\n controller?: string | string[]\n verificationMethod?: VerificationMethod[]\n service?: Service[]\n /**\n * @deprecated\n */\n publicKey?: VerificationMethod[]\n} & {\n [x in KeyCapabilitySection]?: (string | VerificationMethod)[]\n}\n\n/**\n * Represents a Service entry in a {@link https://www.w3.org/TR/did-core/#did-document-properties | DID document}.\n *\n * @see {@link https://www.w3.org/TR/did-core/#services}\n * @see {@link https://www.w3.org/TR/did-core/#service-properties}\n */\nexport interface Service {\n id: string\n type: string\n serviceEndpoint: ServiceEndpoint | ServiceEndpoint[]\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any\n}\n\n/**\n * Represents an endpoint of a Service entry in a DID document.\n *\n * @see {@link https://www.w3.org/TR/did-core/#dfn-serviceendpoint}\n * @see {@link https://www.w3.org/TR/did-core/#services}\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ServiceEndpoint = string | Record<string, any>\n\n/**\n * Encapsulates a JSON web key type that includes only the public properties that\n * can be used in DID documents.\n *\n * The private properties are intentionally omitted to discourage the use\n * (and accidental disclosure) of private keys in DID documents.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc7517 | RFC7517 JsonWebKey (JWK)}\n */\nexport interface JsonWebKey extends Extensible {\n alg?: string\n crv?: string\n e?: string\n ext?: boolean\n key_ops?: string[]\n kid?: string\n kty: string\n n?: string\n use?: string\n x?: string\n y?: string\n}\n\n/**\n * Represents the properties of a Verification Method listed in a DID document.\n *\n * This data type includes public key representations that are no longer present in the spec but are still used by\n * several DID methods / resolvers and kept for backward compatibility.\n *\n * @see {@link https://www.w3.org/TR/did-core/#verification-methods}\n * @see {@link https://www.w3.org/TR/did-core/#verification-method-properties}\n */\nexport interface VerificationMethod {\n id: string\n type: string\n controller: string\n publicKeyBase58?: string\n publicKeyBase64?: string\n publicKeyJwk?: JsonWebKey\n publicKeyHex?: string\n publicKeyMultibase?: string\n blockchainAccountId?: string\n ethereumAddress?: string\n\n // ConditionalProof2022 subtypes\n conditionOr?: VerificationMethod[]\n conditionAnd?: VerificationMethod[]\n threshold?: number\n conditionThreshold?: VerificationMethod[]\n conditionWeightedThreshold?: ConditionWeightedThreshold[]\n conditionDelegated?: string\n relationshipParent?: string[]\n relationshipChild?: string[]\n relationshipSibling?: string[]\n}\n\nexport interface ConditionWeightedThreshold {\n condition: VerificationMethod\n weight: number\n}\n\n/**\n * URI params resulting from parsing a DID URI\n */\nexport interface Params {\n [index: string]: string\n}\n\n/**\n * An object containing the results of parsing a DID URI string.\n *\n * This is forwarded to implementations of particular DID resolvers when calling the `resolve` method.\n *\n * @see {@link Resolver}\n * @see {@link Resolvable.resolve}\n */\nexport interface ParsedDID {\n did: string\n didUrl: string\n method: string\n id: string\n path?: string\n fragment?: string\n query?: string\n params?: Params\n}\n\n/**\n * The DID resolution function that DID Resolver implementations must implement.\n */\nexport type DIDResolver = (\n did: string,\n parsed: ParsedDID,\n resolver: Resolvable,\n options: DIDResolutionOptions\n) => Promise<DIDResolutionResult>\nexport type WrappedResolver = () => Promise<DIDResolutionResult>\nexport type DIDCache = (parsed: ParsedDID, resolve: WrappedResolver) => Promise<DIDResolutionResult>\nexport type LegacyDIDResolver = (did: string, parsed: ParsedDID, resolver: Resolvable) => Promise<DIDDocument>\n\nexport type ResolverRegistry = Record<string, DIDResolver>\n\nexport interface LegacyResolverRegistry {\n [index: string]: LegacyDIDResolver\n}\n\nexport interface ResolverOptions {\n cache?: DIDCache | boolean | undefined\n legacyResolvers?: LegacyResolverRegistry\n}\n\nexport function inMemoryCache(): DIDCache {\n const cache: Map<string, DIDResolutionResult> = new Map()\n return async (parsed: ParsedDID, resolve) => {\n if (parsed.params && parsed.params['no-cache'] === 'true') return await resolve()\n\n const cached = cache.get(parsed.didUrl)\n if (cached !== undefined) return cached\n const result = await resolve()\n if (result.didResolutionMetadata?.error !== 'notFound') {\n cache.set(parsed.didUrl, result)\n }\n return result\n }\n}\n\nexport function noCache(parsed: ParsedDID, resolve: WrappedResolver): Promise<DIDResolutionResult> {\n return resolve()\n}\n\nconst PCT_ENCODED = '(?:%[0-9a-fA-F]{2})'\nconst ID_CHAR = `(?:[a-zA-Z0-9._-]|${PCT_ENCODED})`\nconst METHOD = '([a-z0-9]+)'\nconst METHOD_ID = `((?:${ID_CHAR}*:)*(${ID_CHAR}+))`\nconst PARAM_CHAR = '[a-zA-Z0-9_.:%-]'\nconst PARAM = `;${PARAM_CHAR}+=${PARAM_CHAR}*`\nconst PARAMS = `((${PARAM})*)`\nconst PATH = `(/[^#?]*)?`\nconst QUERY = `([?][^#]*)?`\nconst FRAGMENT = `(#.*)?`\nconst DID_MATCHER = new RegExp(`^did:${METHOD}:${METHOD_ID}${PARAMS}${PATH}${QUERY}${FRAGMENT}$`)\n\n/**\n * Parses a DID URL and builds a {@link ParsedDID | ParsedDID object}\n *\n * @param didUrl - the DID URL string to be parsed\n * @returns a ParsedDID object, or null if the input is not a DID URL\n */\nexport function parse(didUrl: string): ParsedDID | null {\n if (didUrl === '' || !didUrl) return null\n const sections = didUrl.match(DID_MATCHER)\n if (sections) {\n const parts: ParsedDID = {\n did: `did:${sections[1]}:${sections[2]}`,\n method: sections[1],\n id: sections[2],\n didUrl,\n }\n if (sections[4]) {\n const params = sections[4].slice(1).split(';')\n parts.params = {}\n for (const p of params) {\n const kv = p.split('=')\n parts.params[kv[0]] = kv[1]\n }\n }\n if (sections[6]) parts.path = sections[6]\n if (sections[7]) parts.query = sections[7].slice(1)\n if (sections[8]) parts.fragment = sections[8].slice(1)\n return parts\n }\n return null\n}\n\nconst EMPTY_RESULT: DIDResolutionResult = {\n didResolutionMetadata: {},\n didDocument: null,\n didDocumentMetadata: {},\n}\n\nexport function wrapLegacyResolver(resolve: LegacyDIDResolver): DIDResolver {\n return async (did, parsed, resolver) => {\n try {\n const doc = await resolve(did, parsed, resolver)\n return {\n ...EMPTY_RESULT,\n didResolutionMetadata: { contentType: 'application/did+ld+json' },\n didDocument: doc,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n return {\n ...EMPTY_RESULT,\n didResolutionMetadata: {\n error: 'notFound',\n message: e.toString(), // This is not in spec, but may be helpful\n },\n }\n }\n }\n}\n\n/**\n * The method signature implemented by this resolver.\n */\nexport interface Resolvable {\n resolve: (didUrl: string, options?: DIDResolutionOptions) => Promise<DIDResolutionResult>\n}\n\n/**\n * This implementation of {@link Resolvable} bundles together multiple implementations of {@link DIDResolver} and\n * presents a single function call to users.\n */\nexport class Resolver implements Resolvable {\n private readonly registry: ResolverRegistry\n private readonly cache: DIDCache\n\n constructor(registry: ResolverRegistry = {}, options: ResolverOptions = {}) {\n this.registry = registry\n this.cache = options.cache === true ? inMemoryCache() : options.cache || noCache\n if (options.legacyResolvers) {\n Object.keys(options.legacyResolvers).map((methodName) => {\n if (!this.registry[methodName]) {\n this.registry[methodName] = wrapLegacyResolver(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n options.legacyResolvers![methodName]\n )\n }\n })\n }\n }\n\n async resolve(didUrl: string, options: DIDResolutionOptions = {}): Promise<DIDResolutionResult> {\n const parsed = parse(didUrl)\n if (parsed === null) {\n return {\n ...EMPTY_RESULT,\n didResolutionMetadata: { error: 'invalidDid' },\n }\n }\n const resolver = this.registry[parsed.method]\n if (!resolver) {\n return {\n ...EMPTY_RESULT,\n didResolutionMetadata: { error: 'unsupportedDidMethod' },\n }\n }\n return this.cache(parsed, () => resolver(parsed.did, parsed, this, options))\n }\n}\n"],"names":["inMemoryCache","cache","Map","parsed","resolve","cached","get","didUrl","undefined","result","didResolutionMetadata","error","set","params","noCache","PCT_ENCODED","ID_CHAR","METHOD","METHOD_ID","PARAM_CHAR","PARAM","PARAMS","PATH","QUERY","FRAGMENT","DID_MATCHER","RegExp","parse","sections","match","parts","did","method","id","slice","split","p","kv","path","query","fragment","EMPTY_RESULT","didDocument","didDocumentMetadata","wrapLegacyResolver","resolver","doc","contentType","e","message","toString","Resolver","constructor","registry","options","legacyResolvers","Object","keys","map","methodName"],"mappings":"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"}