UNPKG

@sphereon/ssi-sdk-ext.did-resolver-ebsi

Version:

Sphereon did:ebsi resolver for Legal Entities.

77 lines (69 loc) 2.87 kB
import { DIDDocument, DIDResolutionOptions } from 'did-resolver' import fetch from 'cross-fetch' export const EBSI_TEST_REGISTRY = 'https://api-test.ebsi.eu/did-registry/v5/identifiers' export const EBSI_PILOT_REGISTRY_V5 = 'https://api-pilot.ebsi.eu/did-registry/v5' export const EBSI_CONFORMANCE_REGISTRY_V5 = 'https://api-conformance.ebsi.eu/did-registry/v5/identifiers' export const EBSI_PILOT_REGISTRY_V4 = 'https://api-pilot.ebsi.eu/did-registry/v4' export const EBSI_CONFORMANCE_REGISTRY_V4 = 'https://api-conformance.ebsi.eu/did-registry/v4/identifiers' type EBSIResolutionOptions = DIDResolutionOptions & { noFallbackRegistries?: boolean noEnvVarRegistry?: boolean registries?: string[] registry?: string } export const keyToDidDoc = async (did: string, contentType: string, options: EBSIResolutionOptions): Promise<DIDDocument> => { const registries = determineRegistries(options) for (const registry of registries) { try { const didDocument = await keyToDidDocImpl(did, contentType, registry, options) if (didDocument && !('error' in didDocument)) { return didDocument } } catch (error: unknown) { console.log(error) } } return Promise.reject(new Error(`Could not resolve DID ${did} using registries: ${JSON.stringify(registries)}`)) } const keyToDidDocImpl = async (did: string, contentType: string, registry: string, options: DIDResolutionOptions): Promise<DIDDocument> => { const uri = didURI(did, registry) const response = await fetch(uri) if (response.status >= 400) { throw Error(await response.json()) } return (await response.json()) as DIDDocument } const didURI = (did: string, registry: string) => { let uri = registry if (uri.endsWith('/')) { uri = uri.substring(0, uri.length - 1) } if (!uri.includes('identifiers')) { uri += '/identifiers' } return `${uri}/${did}` } const determineRegistries = (options: EBSIResolutionOptions): string[] => { let registries = new Set<string>() if (options.registries && Array.isArray(options.registries) && options.registries.length > 0) { options.registries.forEach(registries.add) } if (options.registry) { registries.add(options.registry) } if (options.noEnvVarRegistry !== true && process.env.EBSI_DEFAULT_REGISTRY) { registries.add(process.env.EBSI_DEFAULT_REGISTRY) } if (options.noFallbackRegistries !== true) { registries.add(EBSI_PILOT_REGISTRY_V5) registries.add(EBSI_CONFORMANCE_REGISTRY_V5) registries.add(EBSI_PILOT_REGISTRY_V4) registries.add(EBSI_CONFORMANCE_REGISTRY_V4) registries.add(EBSI_TEST_REGISTRY) } if (registries.size === 0) { throw Error('Please provide a registry as an option, a fallback registry or use an environment variable (EBSI_DEFAULT_REGISTRY)') } return Array.from(registries) } export default { keyToDidDoc }