{"version":3,"sources":["../src/index.ts","../src/OID4VCIRestAPI.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './OID4VCIRestAPI'\nexport * from './types'\n","import { CredentialDataSupplier, VcIssuer } from '@sphereon/oid4vci-issuer'\nimport { getBasePath, OID4VCIServer } from '@sphereon/oid4vci-issuer-server'\nimport { IOID4VCIServerOpts } from '@sphereon/oid4vci-issuer-server'\nimport { ExpressSupport } from '@sphereon/ssi-express-support'\nimport {\n  createAuthRequestUriCallback,\n  getAccessTokenSignerCallback,\n  IIssuerInstanceArgs,\n  IssuerInstance,\n  createVerifyAuthResponseCallback,\n} from '@sphereon/ssi-sdk.oid4vci-issuer'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\nimport swaggerUi from 'swagger-ui-express'\n\nexport interface IOID4VCIRestAPIOpts extends IOID4VCIServerOpts {}\n\nexport class OID4VCIRestAPI {\n  private readonly _expressSupport: ExpressSupport\n  private readonly _context: IRequiredContext\n  private readonly _opts?: IOID4VCIRestAPIOpts\n  private readonly _restApi: OID4VCIServer\n  private readonly _instance: IssuerInstance\n  private readonly _issuer: VcIssuer\n  private readonly _router: Router\n  private _baseUrl: URL\n  private _basePath: string\n\n  static async init(args: {\n    context: IRequiredContext\n    issuerInstanceArgs: IIssuerInstanceArgs\n    credentialDataSupplier?: CredentialDataSupplier\n    expressSupport: ExpressSupport\n    opts?: IOID4VCIRestAPIOpts\n  }): Promise<OID4VCIRestAPI> {\n    const { issuerInstanceArgs, context } = args\n    const opts = args.opts ?? {}\n    const expressSupport = args.expressSupport\n    const instance = await context.agent.oid4vciGetInstance(args.issuerInstanceArgs)\n    const issuer = await instance.get({ context, credentialDataSupplier: args.credentialDataSupplier })\n\n    if (!opts.endpointOpts) {\n      opts.endpointOpts = {}\n    }\n    if (!opts.endpointOpts.tokenEndpointOpts) {\n      opts.endpointOpts.tokenEndpointOpts = {\n        accessTokenIssuer: instance.metadataOptions.credentialIssuer ?? issuer.issuerMetadata.credential_issuer,\n      }\n    }\n    if (\n      opts?.endpointOpts.tokenEndpointOpts?.tokenEndpointDisabled !== true &&\n      typeof opts?.endpointOpts.tokenEndpointOpts?.accessTokenSignerCallback !== 'function'\n    ) {\n      const idOpts = instance.issuerOptions.idOpts\n      const tokenOpts = {\n        iss: opts.endpointOpts.tokenEndpointOpts.accessTokenIssuer ?? instance.metadataOptions.credentialIssuer,\n        didOpts: instance.issuerOptions.didOpts,\n        idOpts,\n      }\n\n      opts.endpointOpts.tokenEndpointOpts.accessTokenSignerCallback = await getAccessTokenSignerCallback(\n        {\n          ...tokenOpts,\n        },\n        args.context,\n      )\n    }\n\n    if (opts?.endpointOpts.authorizationChallengeOpts?.enabled === true) {\n      if (!instance.issuerOptions.presentationDefinitionId) {\n        throw Error(`Unable to set createAuthRequestUriCallback. No presentationDefinitionId present in issuer options`)\n      }\n\n      if (typeof opts?.endpointOpts.authorizationChallengeOpts.createAuthRequestUriCallback !== 'function') {\n        if (!opts.endpointOpts.authorizationChallengeOpts?.createAuthRequestUriEndpointPath) {\n          throw Error(`Unable to set createAuthRequestUriCallback. No createAuthRequestUriEndpointPath present in options`)\n        }\n\n        opts.endpointOpts.authorizationChallengeOpts.createAuthRequestUriCallback = await createAuthRequestUriCallback({\n          path: opts.endpointOpts.authorizationChallengeOpts.createAuthRequestUriEndpointPath,\n          presentationDefinitionId: instance.issuerOptions.presentationDefinitionId,\n        })\n      }\n\n      if (typeof opts?.endpointOpts.authorizationChallengeOpts?.verifyAuthResponseCallback !== 'function') {\n        if (!opts.endpointOpts.authorizationChallengeOpts?.verifyAuthResponseEndpointPath) {\n          throw Error(`Unable to set verifyAuthResponseCallback. No createAuthRequestUriEndpointPath present in options`)\n        }\n\n        opts.endpointOpts.authorizationChallengeOpts.verifyAuthResponseCallback = await createVerifyAuthResponseCallback({\n          path: opts.endpointOpts.authorizationChallengeOpts.verifyAuthResponseEndpointPath,\n          presentationDefinitionId: instance.issuerOptions.presentationDefinitionId,\n        })\n      }\n    }\n\n    return new OID4VCIRestAPI({ context, issuerInstanceArgs, expressSupport, opts, instance, issuer })\n  }\n\n  private readonly OID4VCI_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VCI/0.1.1'\n\n  private constructor(args: {\n    issuer: VcIssuer\n    instance: IssuerInstance\n    context: IRequiredContext\n    issuerInstanceArgs: IIssuerInstanceArgs\n    expressSupport: ExpressSupport\n    opts: IOID4VCIRestAPIOpts\n  }) {\n    const { context, opts, issuerInstanceArgs } = args\n    this._baseUrl = new URL(\n      opts?.baseUrl ??\n        process.env.BASE_URL ??\n        opts?.issuer?.issuerMetadata?.credential_issuer ??\n        issuerInstanceArgs.credentialIssuer ??\n        'http://localhost',\n    )\n    this._basePath = getBasePath(this._baseUrl)\n    this._context = context\n    this._opts = opts ?? {}\n    this._expressSupport = args.expressSupport\n    this._issuer = args.issuer\n    this._instance = args.instance\n    this._restApi = new OID4VCIServer(args.expressSupport, { ...opts, issuer: this._issuer })\n\n    // The above setups the generic OID4VCI management and wallet APIs from the OID4VCI lib.\n    // Below sets up the management of configurations\n    this._router = express.Router()\n    this.express.use(this._basePath, this._router)\n    this.setupSwaggerUi()\n  }\n\n  private setupSwaggerUi() {\n    fetch(this.OID4VCI_SWAGGER_URL)\n      .then((res) => res.json())\n      .then((swagger: any) => {\n        const apiDocs = `/api-docs`\n        console.log(`[OID4VCI] API docs available at ${this._baseUrl.toString()}${this._basePath}${apiDocs}`)\n        swagger.servers = [{ url: this._baseUrl.toString(), description: 'This server' }]\n        this.express.set('trust proxy', this.opts?.endpointOpts?.trustProxy ?? true)\n        this._router.use(\n          apiDocs,\n          (req: Request, res: Response, next: any) => {\n            // @ts-ignore\n            req.swaggerDoc = swagger\n            next()\n          },\n          swaggerUi.serveFiles(swagger, options),\n          swaggerUi.setup(),\n        )\n      })\n      .catch((err) => {\n        console.log(`[OID4VCI] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n      })\n    const options = {\n      // customCss: '.swagger-ui .topbar { display: none }',\n    }\n  }\n\n  get express(): Express {\n    return this._expressSupport.express\n  }\n\n  get context(): IRequiredContext {\n    return this._context\n  }\n\n  get opts(): IOID4VCIRestAPIOpts | undefined {\n    return this._opts\n  }\n\n  get restApi(): OID4VCIServer {\n    return this._restApi\n  }\n\n  get instance(): IssuerInstance {\n    return this._instance\n  }\n\n  get issuer(): VcIssuer {\n    return this._issuer\n  }\n\n  async stop(): Promise<boolean> {\n    return this._expressSupport.stop()\n  }\n}\n"],"mappings":"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","names":["OID4VCIRestAPI","_expressSupport","_context","_opts","_restApi","_instance","_issuer","_router","_baseUrl","_basePath","init","args","issuerInstanceArgs","context","opts","expressSupport","instance","agent","oid4vciGetInstance","issuer","get","credentialDataSupplier","endpointOpts","tokenEndpointOpts","accessTokenIssuer","metadataOptions","credentialIssuer","issuerMetadata","credential_issuer","tokenEndpointDisabled","accessTokenSignerCallback","idOpts","issuerOptions","tokenOpts","iss","didOpts","getAccessTokenSignerCallback","authorizationChallengeOpts","enabled","presentationDefinitionId","Error","createAuthRequestUriCallback","createAuthRequestUriEndpointPath","path","verifyAuthResponseCallback","verifyAuthResponseEndpointPath","createVerifyAuthResponseCallback","OID4VCI_SWAGGER_URL","URL","baseUrl","process","env","BASE_URL","getBasePath","OID4VCIServer","express","Router","use","setupSwaggerUi","fetch","then","res","json","swagger","apiDocs","console","log","toString","servers","url","description","set","trustProxy","req","next","swaggerDoc","swaggerUi","serveFiles","options","setup","catch","err","restApi","stop"]}