import { DIDDocument } from './didDocument.dto.js'; import axios from 'axios'; import { EBSI } from '../config.js'; import { InvalidDidDocumentException } from './exceptions/invalidDidDocumentException.js'; import didKeyWrapper from '../shared/middleware/didKeyWrapper.js'; import { CredentialValidationOptions } from '../shared/dto/validationOptions.dto.js'; import { InvalidDidMethodException } from './exceptions/invalidDidMethodException.js'; import { isEbsiDid, isKeyDid, isWebDid } from '../shared/utils.js'; const isUrlBareDomain = (url: string): boolean => { if (!url) return false; return !url.includes('/'); }; export class DidDocumentResolver { resolveDid = async ( did: string, opts?: CredentialValidationOptions, ): Promise => { if (isKeyDid(did)) return this.resolveDidKeyDocument(did); if (isWebDid(did)) return this.resolveDidWebDocument(did); if (isEbsiDid(did)) return this.resolvedDidEbsiDocument(did, opts); throw new InvalidDidMethodException(); }; private resolveDidKeyDocument = async (did: string): Promise => { try { return (await didKeyWrapper.resolveDid(did)).didDocument as DIDDocument; } catch { throw new InvalidDidDocumentException(did); } }; private resolveDidWebDocument = async (did: string): Promise => { const didUrl = did.replace('did:web:', '').replace(/:/g, '/'); let didDocumentUrl = `https://${didUrl}/did.json`; if (isUrlBareDomain(didUrl)) { didDocumentUrl = `https://${didUrl}/.well-known/did.json`; } try { const response = await axios.get(didDocumentUrl); return response.data as DIDDocument; } catch { throw new InvalidDidDocumentException(did); } }; private resolvedDidEbsiDocument = async ( did: string, opts?: CredentialValidationOptions, ): Promise => { try { const didResolverUrl = opts?.didRegistry ? opts.didRegistry : EBSI.didResolver; const response = await axios.get(`${didResolverUrl}/${did}`); return response.data as DIDDocument; } catch (e) { throw new InvalidDidDocumentException(did); } }; }