{"version":3,"file":"issuerMetadataEndpoint.mjs","names":[],"sources":["../../../src/openid4vc-issuer/router/issuerMetadataEndpoint.ts"],"sourcesContent":["import { getAuthorizationServerMetadataFromList } from '@openid4vc/oauth2'\nimport type { Response, Router } from 'express'\nimport type { OpenId4VciCredentialIssuerMetadata } from '../../shared'\nimport { getRequestContext, sendJsonResponse, sendUnknownServerErrorResponse } from '../../shared/router'\nimport { OpenId4VcIssuerService } from '../OpenId4VcIssuerService'\nimport type { OpenId4VcIssuanceRequest } from './requestContext'\n\nexport function configureIssuerMetadataEndpoint(router: Router, path: string) {\n  router.get(path, async (request: OpenId4VcIssuanceRequest, response: Response, next) => {\n    const { agentContext, issuer } = getRequestContext(request)\n    try {\n      const openId4VcIssuerService = agentContext.dependencyManager.resolve(OpenId4VcIssuerService)\n      const issuerMetadata = await openId4VcIssuerService.getIssuerMetadata(agentContext, issuer)\n      const vcIssuer = openId4VcIssuerService.getIssuer(agentContext)\n      const issuerAuthorizationServer = getAuthorizationServerMetadataFromList(\n        issuerMetadata.authorizationServers,\n        issuerMetadata.credentialIssuer.credential_issuer\n      )\n\n      // NOTE: for now we default to unsigned if the wallet doesn't explicitly indicate it supports signed\n      const acceptedMediaTypes = request.headers.accept ? parseAcceptHeader(request.headers.accept) : []\n\n      const mediaTypeToUse =\n        acceptedMediaTypes.find(\n          ({ mediaType }) =>\n            mediaType === 'application/json' || (issuerMetadata.signedMetadataJwt && mediaType === 'application/jwt')\n        )?.mediaType ?? 'application/json'\n\n      const transformedMetadata = {\n        // Get the draft 11 metadata (it also contains draft 14)\n        ...vcIssuer.getCredentialIssuerMetadataDraft11(issuerMetadata.credentialIssuer),\n\n        // TODO: these values should be removed, as they need to be hosted in the oauth-authorization-server\n        // metadata. For backwards compatibility we will keep them in now.\n        token_endpoint: issuerAuthorizationServer.token_endpoint,\n        dpop_signing_alg_values_supported: issuerAuthorizationServer.dpop_signing_alg_values_supported,\n      } satisfies OpenId4VciCredentialIssuerMetadata\n\n      if (issuerMetadata.signedMetadataJwt && mediaTypeToUse === 'application/jwt') {\n        response.type('application/jwt').status(200).send(issuerMetadata.signedMetadataJwt)\n      } else {\n        return sendJsonResponse(response, next, transformedMetadata)\n      }\n    } catch (e) {\n      return sendUnknownServerErrorResponse(response, next, agentContext.config.logger, e)\n    }\n  })\n}\n\nfunction parseAcceptHeader(header: string) {\n  return header\n    .split(',')\n    .map((type) => {\n      const [mediaType, ...params] = type.trim().split(';')\n      let quality = 1\n\n      // Extract quality value if present\n      const qParam = params.find((p) => p.trim().startsWith('q='))\n      if (qParam) {\n        quality = parseFloat(qParam.split('=')[1]) || 1.0\n      }\n\n      return {\n        mediaType: mediaType.trim(),\n        quality: quality,\n      }\n    })\n    .sort((a, b) => b.quality - a.quality) // Sort by preference\n}\n"],"mappings":";;;;;;AAOA,SAAgB,gCAAgC,QAAgB,MAAc;AAC5E,QAAO,IAAI,MAAM,OAAO,SAAmC,UAAoB,SAAS;EACtF,MAAM,EAAE,cAAc,WAAW,kBAAkB,QAAQ;AAC3D,MAAI;GACF,MAAM,yBAAyB,aAAa,kBAAkB,QAAQ,uBAAuB;GAC7F,MAAM,iBAAiB,MAAM,uBAAuB,kBAAkB,cAAc,OAAO;GAC3F,MAAM,WAAW,uBAAuB,UAAU,aAAa;GAC/D,MAAM,4BAA4B,uCAChC,eAAe,sBACf,eAAe,iBAAiB,kBACjC;GAKD,MAAM,kBAFqB,QAAQ,QAAQ,SAAS,kBAAkB,QAAQ,QAAQ,OAAO,GAAG,EAAE,EAG7E,MAChB,EAAE,gBACD,cAAc,sBAAuB,eAAe,qBAAqB,cAAc,kBAC1F,EAAE,aAAa;GAElB,MAAM,sBAAsB;IAE1B,GAAG,SAAS,mCAAmC,eAAe,iBAAiB;IAI/E,gBAAgB,0BAA0B;IAC1C,mCAAmC,0BAA0B;IAC9D;AAED,OAAI,eAAe,qBAAqB,mBAAmB,kBACzD,UAAS,KAAK,kBAAkB,CAAC,OAAO,IAAI,CAAC,KAAK,eAAe,kBAAkB;OAEnF,QAAO,iBAAiB,UAAU,MAAM,oBAAoB;WAEvD,GAAG;AACV,UAAO,+BAA+B,UAAU,MAAM,aAAa,OAAO,QAAQ,EAAE;;GAEtF;;AAGJ,SAAS,kBAAkB,QAAgB;AACzC,QAAO,OACJ,MAAM,IAAI,CACV,KAAK,SAAS;EACb,MAAM,CAAC,WAAW,GAAG,UAAU,KAAK,MAAM,CAAC,MAAM,IAAI;EACrD,IAAI,UAAU;EAGd,MAAM,SAAS,OAAO,MAAM,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,CAAC;AAC5D,MAAI,OACF,WAAU,WAAW,OAAO,MAAM,IAAI,CAAC,GAAG,IAAI;AAGhD,SAAO;GACL,WAAW,UAAU,MAAM;GAClB;GACV;GACD,CACD,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ"}