{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.55.0_@types+node@20.19.25__@swc+core@1.15.2_@swc+_119fedc18e19d1717452bb9e989205b3/node_modules/tsup/assets/cjs_shims.js","../src/siop-api-functions.ts","../src/universal-oid4vp-api-functions.ts","../src/middleware/validationMiddleware.ts","../src/siopv2-rp-api-server.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './siop-api-functions'\nexport * from './universal-oid4vp-api-functions'\nexport * from './types'\nexport * from './siopv2-rp-api-server'\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n  typeof document === \"undefined\" \n    ? new URL(`file:${__filename}`).href \n    : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n      ? document.currentScript.src \n      : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { AuthorizationResponsePayload, PresentationSubmission } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { CredentialMapper } from '@sphereon/ssi-types'\nimport { Request, Response, Router } from 'express'\nimport { validate as isValidUUID } from 'uuid'\nimport { IRequiredContext } from './types'\nimport { DcqlQuery } from 'dcql'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n  const contentType = request.header('content-type')\n\n  if (contentType?.startsWith('application/json')) {\n    const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n    return payload as AuthorizationResponsePayload\n  }\n\n  if (contentType?.startsWith('application/x-www-form-urlencoded')) {\n    const payload = request.body as AuthorizationResponsePayload\n\n    // Parse presentation_submission if it's a string\n    if (typeof payload.presentation_submission === 'string') {\n      console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n      payload.presentation_submission = JSON.parse(payload.presentation_submission)\n    }\n\n    // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n    if (typeof payload.vp_token === 'string') {\n      const { vp_token } = payload\n\n      // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n      // (Leaving the vp_token JsonLdAsString causes problems because the original credential will remain string and will be interpreted as JWT in some parts of the code)\n      if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n        payload.vp_token = JSON.parse(vp_token)\n      }\n    }\n\n    return payload\n  }\n\n  throw new Error(\n    `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n  )\n}\n\nconst validatePresentationSubmission = (query: DcqlQuery, submission: PresentationSubmission): boolean => {\n  return query.credentials.every((credential) => credential.id in submission)\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n    return\n  }\n  const path = opts?.path ?? '/siop/queries/:queryId/auth-responses/:correlationId'\n  router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n    try {\n      const { correlationId, queryId, tenantId, version } = request.params\n      if (!correlationId) {\n        console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)\n        return sendErrorResponse(response, 404, 'No authorization request could be found')\n      }\n      console.debug('Authorization Response (siop-sessions') // TODO use logger\n      console.debug(JSON.stringify(request.body, null, 2))\n      const definitionItems = await context.agent.pdmGetDefinitions({\n        filter: buildQueryIdFilter(queryId, tenantId, version),\n      })\n      if (definitionItems.length === 0) {\n        console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n        response.statusCode = 404\n        response.statusMessage = `No definition ${queryId}`\n        return response.send()\n      }\n\n      const authorizationResponse = parseAuthorizationResponse(request)\n      console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n      const definitionItem = definitionItems[0]\n      const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n        authorizationResponse,\n        correlationId,\n        dcqlQuery: definitionItem.query,\n      })\n\n      const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n      if (presentation && validatePresentationSubmission(definitionItem.query, presentation)) {\n        console.log('PRESENTATIONS:' + JSON.stringify(presentation, null, 2))\n        response.statusCode = 200\n\n        const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {\n          presentation_during_issuance_session: verifiedResponse.correlationId,\n        }\n        if (authorizationResponse.is_first_party) {\n          response.setHeader('Content-Type', 'application/json')\n          return response.send(JSON.stringify(authorizationChallengeValidationResponse))\n        }\n\n        const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, state: verifiedResponse.state })\n        if (responseRedirectURI) {\n          response.setHeader('Content-Type', 'application/json')\n          return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n        }\n        // todo: delete session\n      } else {\n        console.log('Missing Presentation (Verifiable Credentials)')\n        response.statusCode = 500\n        response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n      }\n      return response.send()\n    } catch (error) {\n      console.error(error)\n      return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n    }\n  })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`getAuthRequest SIOP endpoint is disabled`)\n    return\n  }\n  const path = opts?.path ?? '/siop/queries/:queryId/auth-requests/:correlationId'\n  router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n    try {\n      const correlationId = request.params.correlationId\n      const queryId = request.params.queryId\n      if (!correlationId || !queryId) {\n        console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)\n        return sendErrorResponse(response, 404, 'No authorization request could be found')\n      }\n      const requestState = await context.agent.siopGetAuthRequestState({\n        correlationId,\n        errorOnNotFound: false,\n      })\n      if (!requestState) {\n        console.log(\n          `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${queryId}`,\n        )\n        return sendErrorResponse(response, 404, `No authorization request could be found`)\n      }\n\n      const definitionItems = await context.agent.pdmGetDefinitions({ filter: buildQueryIdFilter(queryId) })\n      if (definitionItems.length === 0) {\n        console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n        response.statusCode = 404\n        response.statusMessage = `No definition ${queryId}`\n        return response.send()\n      }\n      const payload = requestState.request?.requestObject?.getPayload()!\n      payload.dcql_query = definitionItems[0].query\n      const requestObject = await requestState.request?.requestObject?.toJwt()\n      console.log('JWT Request object:')\n      console.log(requestObject)\n\n      let error: string | undefined\n      try {\n        response.statusCode = 200\n        response.setHeader('Content-Type', 'application/jwt')\n        return response.send(requestObject)\n      } catch (e) {\n        error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n        return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n      } finally {\n        await context.agent.siopUpdateAuthRequestState({\n          correlationId,\n          state: 'authorization_request_created',\n          error,\n        })\n      }\n    } catch (error) {\n      return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n    }\n  })\n}\n\nexport function buildQueryIdFilter(queryId: string, tenantId?: string, version?: string) {\n  const queryFilter = {\n    queryId,\n    ...(tenantId ? { tenantId } : {}),\n    ...(version ? { version } : {}),\n  }\n\n  return [queryFilter, ...(isValidUUID(queryId) ? [{ id: queryId }] : [])] // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\n}\n","import {\n  AuthorizationRequestStateStatus,\n  CreateAuthorizationRequest,\n  createAuthorizationRequestFromPayload,\n  CreateAuthorizationRequestPayloadSchema,\n  CreateAuthorizationResponsePayload,\n} from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport { buildQueryIdFilter } from './siop-api-functions'\nimport {\n  AuthStatusResponse,\n  CreateAuthorizationRequestPayloadRequest,\n  CreateAuthorizationResponsePayloadResponse,\n  DeleteAuthorizationRequest,\n  GetAuthorizationRequestStatus,\n  ICreateAuthRequestWebappEndpointOpts,\n  IRequiredContext,\n  QRCodeOpts,\n} from './types'\n\nexport function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`createAuthRequest universal OID4VP endpoint is disabled`)\n    return\n  }\n\n  const path = opts?.path ?? '/backend/auth/requests'\n  router.post(\n    path,\n    checkAuth(opts?.endpoint),\n    validateData(CreateAuthorizationRequestPayloadSchema),\n    async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {\n      try {\n        const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)\n        const correlationId = authRequest.correlationId ?? uuid.uuid()\n        const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts\n        const queryId = authRequest.queryId\n\n        const definitionItems = await context.agent.pdmGetDefinitions({\n          filter: buildQueryIdFilter(queryId),\n        })\n        if (definitionItems.length === 0) {\n          console.log(`No query could be found for the given id. Query id: ${queryId}`)\n          return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })\n        }\n\n        const requestByReferenceURI = uriWithBase(`/siop/queries/${queryId}/auth-requests/${correlationId}`, {\n          baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,\n        })\n        const responseURI = uriWithBase(`/siop/queries/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })\n\n        const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n          queryId,\n          correlationId,\n          nonce: uuid.uuid(),\n          requestByReferenceURI,\n          responseURIType: 'response_uri',\n          responseURI,\n          ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),\n          ...(authRequest.callback && { callback: authRequest.callback }),\n        })\n\n        let qrCodeDataUri: string | undefined\n        if (qrCodeOpts) {\n          const { AwesomeQR } = await import('awesome-qr')\n          const qrCode = new AwesomeQR({\n            text: authRequestURI,\n            size: qrCodeOpts.size ?? 250,\n            colorDark: qrCodeOpts.colorDark ?? '#000000',\n            colorLight: qrCodeOpts.colorLight ?? '#FFFFFF',\n          })\n          qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n        } else {\n          qrCodeDataUri = authRequestURI\n        }\n\n        const authRequestBody = {\n          query_id: queryId,\n          correlation_id: correlationId,\n          request_uri: authRequestURI,\n          status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,\n          ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),\n        } satisfies CreateAuthorizationResponsePayload\n        console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n\n        return response.status(201).json(authRequestBody)\n      } catch (error) {\n        return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)\n      }\n    },\n  )\n}\n\nexport function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)\n    return\n  }\n\n  const path = opts?.path ?? '/backend/auth/requests/:correlationId'\n  router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {\n    try {\n      const correlationId: string = request.params.correlationId\n\n      const authRequestState = await context.agent.siopGetAuthRequestState({\n        correlationId,\n        errorOnNotFound: false,\n      })\n      if (!authRequestState) {\n        console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n        return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n      }\n\n      await context.agent.siopDeleteAuthState({ correlationId })\n\n      return response.status(204).json()\n    } catch (error) {\n      return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n    }\n  })\n}\n\nexport function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`authStatus universal OID4VP endpoint is disabled`)\n    return\n  }\n\n  const path = opts?.path ?? '/backend/auth/status/:correlationId'\n  router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {\n    try {\n      console.log('Received auth-status request...')\n      const correlationId: string = request.params.correlationId\n\n      const requestState = await context.agent.siopGetAuthRequestState({\n        correlationId,\n        errorOnNotFound: false,\n      })\n\n      if (!requestState) {\n        console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n        return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n      }\n\n      let responseState\n      if (requestState.status === AuthorizationRequestStateStatus.RETRIEVED) {\n        responseState = await context.agent.siopGetAuthResponseState({\n          correlationId,\n          errorOnNotFound: false,\n        })\n      }\n      const overallState = responseState ?? requestState\n\n      const statusBody = {\n        status: overallState.status,\n        correlation_id: overallState.correlationId,\n        query_id: overallState.queryId,\n        last_updated: overallState.lastUpdated,\n        ...('verifiedData' in overallState && { verified_data: overallState.verifiedData }),\n        ...(overallState.error && { message: overallState.error.message }),\n      } satisfies AuthStatusResponse\n      console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n\n      if (overallState.status === 'error') {\n        return response.status(500).json(statusBody)\n      }\n      return response.status(200).json(statusBody)\n    } catch (error) {\n      return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n    }\n  })\n}\n\nexport function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n  if (opts?.enabled === false) {\n    console.log(`getDefinitions universal OID4VP endpoint is disabled`)\n    return\n  }\n\n  const path = opts?.path ?? '/backend/definitions'\n  router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n    try {\n      const definitions = await context.agent.pdmGetDefinitions()\n      response.statusCode = 200\n      return response.json(definitions)\n    } catch (error) {\n      return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n    }\n  })\n}\n","import { Request, Response, NextFunction } from 'express'\nimport { z, ZodError } from 'zod'\n\nexport const validateData = (schema: z.ZodObject<any, any>) => {\n  return (req: Request, res: Response, next: NextFunction) => {\n    try {\n      schema.parse(req.body)\n      next()\n    } catch (error) {\n      if (error instanceof ZodError) {\n        const errorMessages = error.issues.map((issue: any) => ({\n          message: `${issue.path.join('.')} is ${issue.message}`,\n        }))\n        res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message })\n      } else {\n        res.status(500).json({ status: 500, message: 'Internal Server Error' })\n      }\n    }\n  }\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n  authStatusUniversalOID4VPEndpoint,\n  createAuthRequestUniversalOID4VPEndpoint,\n  getDefinitionsEndpoint,\n  removeAuthRequestStateUniversalOID4VPEndpoint,\n} from './universal-oid4vp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n  private readonly _express: Express\n  private readonly _router: Router\n  private readonly _agent: TAgent<ISIOPv2RP>\n  private readonly _opts?: ISIOPv2RPRestAPIOpts\n  private readonly _basePath: string\n\n  private readonly OID4VP_OPENAPI_FILE = path.join(__dirname, '..', 'oid4vp-openapi.yml')\n  private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n  constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n    const { agent, opts } = args\n    this._agent = agent\n    copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest', 'webappGetDefinitions'] })\n    if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n      copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n    }\n\n    this._opts = opts\n    this._express = args.expressSupport.express\n    this._router = express.Router()\n    const context = agentContext(agent)\n\n    const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n    console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n    // Webapp endpoints\n    if (features.includes('rp-status')) {\n      createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n      authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n      removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n      getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n    }\n\n    // SIOPv2 endpoints\n    if (features.includes('siop')) {\n      getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n      verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n    }\n    this._basePath = opts?.endpointOpts?.basePath ?? ''\n    this._express.use(this._basePath, this.router)\n    this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n    this.setupSwaggerUi()\n  }\n\n  /**\n   * Sets up Swagger UI for API documentation.\n   * Spec source priority:\n   * 1. OID4VP_OPENAPI_SPEC env var (URL or file path)\n   * 2. Bundled universal-OID4VP-openapi.yaml file\n   * 3. Fallback to SwaggerHub URL\n   */\n  private setupSwaggerUi() {\n    const envSpec = process.env.OID4VP_OPENAPI_SPEC\n    const apiDocsPath = '/api-docs'\n    const specPath = '/api-docs/spec.yaml'\n    const fullApiDocsPath = `${this._basePath}${apiDocsPath}`\n    const fullSpecPath = `${this._basePath}${specPath}`\n\n    // Spec cache shared across all modes\n    let cachedSpec: any = null\n\n    // Determine spec source: env var > bundled file > SwaggerHub URL\n    const isRemoteUrl = envSpec?.startsWith('http://') || envSpec?.startsWith('https://')\n    const isEnvLocalFile = envSpec && !isRemoteUrl\n    // Resolve relative paths from package root\n    const resolvedEnvFile = isEnvLocalFile && !path.isAbsolute(envSpec) ? path.join(__dirname, '..', envSpec) : envSpec\n    const hasBundledFile = fs.existsSync(this.OID4VP_OPENAPI_FILE)\n    const localFile = isEnvLocalFile ? resolvedEnvFile : hasBundledFile ? this.OID4VP_OPENAPI_FILE : undefined\n    const isLocalFile = !!localFile\n\n    if (isEnvLocalFile && !fs.existsSync(resolvedEnvFile!)) {\n      console.log(`[OID4VP] OpenAPI spec file not found at ${resolvedEnvFile}. Swagger UI disabled.`)\n      return\n    }\n\n    const specSource = isRemoteUrl ? envSpec : isLocalFile ? localFile : this.OID4VP_SWAGGER_URL\n    console.log(`[OID4VP] API docs: ${fullApiDocsPath} (spec: ${specSource})`)\n\n    // Unified spec fetcher\n    const getSpec = async (req?: Request): Promise<any> => {\n      if (cachedSpec) {\n        return cachedSpec\n      }\n\n      if (isLocalFile && localFile) {\n        const content = fs.readFileSync(localFile, 'utf-8')\n        try {\n          cachedSpec = JSON.parse(content)\n        } catch {\n          // YAML - return as string, swagger-ui will parse it\n          cachedSpec = content\n        }\n      } else {\n        const url = isRemoteUrl ? envSpec! : this.OID4VP_SWAGGER_URL\n        const response = await fetch(url)\n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}`)\n        }\n        const text = await response.text()\n        try {\n          cachedSpec = JSON.parse(text)\n        } catch {\n          cachedSpec = text\n        }\n      }\n\n      // Set server URL if spec is JSON object\n      if (typeof cachedSpec === 'object' && cachedSpec !== null && req) {\n        cachedSpec.servers = [{ url: `${req.protocol}://${req.get('host')}${this._basePath}`, description: 'This server' }]\n      }\n\n      return cachedSpec\n    }\n\n    // Pre-fetch spec in background\n    getSpec().catch((err) => console.log(`[OID4VP] Spec pre-fetch failed: ${err.message}`))\n\n    // Serve spec at dedicated endpoint\n    this._router.get(specPath, async (req: Request, res: Response) => {\n      try {\n        const spec = await getSpec(req)\n        if (typeof spec === 'string') {\n          res.type('text/yaml').send(spec)\n        } else {\n          res.json(spec)\n        }\n      } catch (err: any) {\n        console.error(`[OID4VP] Spec fetch error: ${err.message}`)\n        res.status(502).json({ error: 'Failed to load OpenAPI spec', details: err.message })\n      }\n    })\n\n    // Swagger UI\n    this._router.use(apiDocsPath, swaggerUi.serve, swaggerUi.setup(undefined, { swaggerOptions: { url: fullSpecPath } }))\n  }\n  get express(): Express {\n    return this._express\n  }\n\n  get router(): Router {\n    return this._router\n  }\n\n  get agent(): TAgent<ISIOPv2RP> {\n    return this._agent\n  }\n\n  get opts(): ISIOPv2RPRestAPIOpts | undefined {\n    return this._opts\n  }\n}\n"],"mappings":"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","names":["getImportMetaUrl","document","URL","__filename","href","currentScript","tagName","toUpperCase","src","baseURI","importMetaUrl","parseAuthorizationResponse","request","contentType","header","startsWith","payload","body","JSON","parse","presentation_submission","console","log","vp_token","endsWith","CredentialMapper","isJsonLdAsString","Error","validatePresentationSubmission","query","submission","credentials","every","credential","id","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","buildQueryIdFilter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","presentation","oid4vpSubmission","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","getPayload","dcql_query","toJwt","e","message","undefined","siopUpdateAuthRequestState","queryFilter","isValidUUID","import_ssi_express_support","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestPayloadSchema","request","response","authRequest","createAuthorizationRequestFromPayload","body","correlationId","uuid","qrCodeOpts","qrCode","queryId","definitionItems","agent","pdmGetDefinitions","filter","buildQueryIdFilter","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","size","colorDark","colorLight","draw","toString","authRequestBody","query_id","correlation_id","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","AuthorizationRequestStateStatus","RETRIEVED","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","verified_data","verifiedData","debug","getDefinitionsEndpoint","definitions","statusCode","import_ssi_sdk","import_ssi_express_support","__filename","fileURLToPath","__dirname","path","dirname","SIOPv2RPApiServer","_express","_router","_agent","_opts","_basePath","OID4VP_OPENAPI_FILE","join","OID4VP_SWAGGER_URL","args","agent","opts","copyGlobalAuthToEndpoints","keys","endpointOpts","globalAuth","secureSiopEndpoints","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createAuthRequestUniversalOID4VPEndpoint","webappCreateAuthRequest","authStatusUniversalOID4VPEndpoint","webappAuthStatus","removeAuthRequestStateUniversalOID4VPEndpoint","webappDeleteAuthRequest","getDefinitionsEndpoint","webappGetDefinitions","getAuthRequestSIOPv2Endpoint","siopGetAuthRequest","verifyAuthResponseSIOPv2Endpoint","siopVerifyAuthResponse","basePath","use","router","set","trustProxy","setupSwaggerUi","envSpec","process","env","OID4VP_OPENAPI_SPEC","apiDocsPath","specPath","fullApiDocsPath","fullSpecPath","cachedSpec","isRemoteUrl","startsWith","isEnvLocalFile","resolvedEnvFile","isAbsolute","hasBundledFile","fs","existsSync","localFile","undefined","isLocalFile","specSource","getSpec","req","content","readFileSync","parse","url","response","fetch","ok","Error","status","text","servers","protocol","get","description","catch","err","message","res","spec","type","send","json","error","details","swaggerUi","serve","setup","swaggerOptions"]}