@sphereon/ssi-sdk.w3c-vc-api 0.34.1-next.3 → 0.34.1-next.322

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -41,7 +41,7 @@ __export(index_exports, {
41
41
  module.exports = __toCommonJS(index_exports);
42
42
 
43
43
  // src/vc-api-server.ts
44
- var import_ssi_sdk5 = require("@sphereon/ssi-sdk.core");
44
+ var import_ssi_sdk4 = require("@sphereon/ssi-sdk.core");
45
45
  var import_express = __toESM(require("express"), 1);
46
46
 
47
47
  // src/api-functions.ts
@@ -50,8 +50,8 @@ var import_ssi_sdk_ext = require("@sphereon/ssi-sdk-ext.identifier-resolution");
50
50
  var import_ssi_sdk = require("@sphereon/ssi-sdk.agent-config");
51
51
  var import_ssi_sdk2 = require("@sphereon/ssi-sdk.credential-store");
52
52
  var import_ssi_sdk3 = require("@sphereon/ssi-sdk.credential-vcdm");
53
- var import_ssi_sdk4 = require("@sphereon/ssi-sdk.data-store");
54
53
  var import_ssi_types = require("@sphereon/ssi-types");
54
+ var import_ssi_types2 = require("@sphereon/ssi-types");
55
55
  var import_debug = __toESM(require("debug"), 1);
56
56
  var import_uuid = require("uuid");
57
57
  var debug = (0, import_debug.default)("sphereon:ssi-sdk:w3c-vc-api");
@@ -80,7 +80,7 @@ function issueCredentialEndpoint(router, context, opts) {
80
80
  proofFormat = opts.issueCredentialOpts.proofFormat.toLocaleLowerCase();
81
81
  }
82
82
  if (proofFormat === void 0) {
83
- if ((0, import_ssi_types.isVcdm2Credential)(credential)) {
83
+ if ((0, import_ssi_types2.isVcdm2Credential)(credential)) {
84
84
  proofFormat = "vc+jwt";
85
85
  } else {
86
86
  proofFormat = "lds";
@@ -106,7 +106,7 @@ function issueCredentialEndpoint(router, context, opts) {
106
106
  proofFormat,
107
107
  fetchRemoteContexts: issueOpts?.fetchRemoteContexts !== false
108
108
  });
109
- const rawDocument = import_ssi_types.CredentialMapper.storedCredentialToOriginalFormat(vc);
109
+ const rawDocument = import_ssi_types2.CredentialMapper.storedCredentialToOriginalFormat(vc);
110
110
  const save = opts?.persistIssuedCredentials;
111
111
  if (save) {
112
112
  const issuer = (0, import_ssi_sdk3.extractIssuer)(credential);
@@ -134,7 +134,7 @@ function issueCredentialEndpoint(router, context, opts) {
134
134
  }
135
135
  const dc = {
136
136
  credential: {
137
- credentialRole: import_ssi_sdk4.CredentialRole.HOLDER,
137
+ credentialRole: import_ssi_types.CredentialRole.HOLDER,
138
138
  // tenantId: 'test-tenant',
139
139
  kmsKeyRef: identifier.kmsKeyRef,
140
140
  identifierMethod: identifier.method,
@@ -148,7 +148,7 @@ function issueCredentialEndpoint(router, context, opts) {
148
148
  response.statusCode = 201;
149
149
  return response.send({
150
150
  verifiableCredential: rawDocument,
151
- uniformCredential: import_ssi_types.CredentialMapper.toUniformCredential(vc)
151
+ uniformCredential: import_ssi_types2.CredentialMapper.toUniformCredential(vc)
152
152
  });
153
153
  } catch (e) {
154
154
  return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
@@ -164,8 +164,8 @@ function getCredentialsEndpoint(router, context, opts) {
164
164
  const path = opts?.path ?? "/credentials";
165
165
  router.get(path, (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
166
166
  try {
167
- const credentialRole = request.query.credentialRole || import_ssi_sdk4.CredentialRole.HOLDER;
168
- if (!Object.values(import_ssi_sdk4.CredentialRole).includes(credentialRole)) {
167
+ const credentialRole = request.query.credentialRole || import_ssi_types.CredentialRole.HOLDER;
168
+ if (!Object.values(import_ssi_types.CredentialRole).includes(credentialRole)) {
169
169
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Invalid credentialRole: ${credentialRole}`);
170
170
  }
171
171
  const documentType = request.query.documentType || import_ssi_sdk2.DocumentType.VC;
@@ -201,8 +201,8 @@ function getCredentialEndpoint(router, context, opts) {
201
201
  if (!id) {
202
202
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "no id provided");
203
203
  }
204
- const credentialRole = request.query.credentialRole || import_ssi_sdk4.CredentialRole.HOLDER;
205
- if (!Object.values(import_ssi_sdk4.CredentialRole).includes(credentialRole)) {
204
+ const credentialRole = request.query.credentialRole || import_ssi_types.CredentialRole.HOLDER;
205
+ if (!Object.values(import_ssi_types.CredentialRole).includes(credentialRole)) {
206
206
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Invalid credentialRole: ${credentialRole}`);
207
207
  }
208
208
  const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({
@@ -265,7 +265,7 @@ function deleteCredentialEndpoint(router, context, opts) {
265
265
  if (credentialRole === void 0) {
266
266
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "credentialRole query parameter is missing");
267
267
  }
268
- if (!Object.values(import_ssi_sdk4.CredentialRole).includes(credentialRole)) {
268
+ if (!Object.values(import_ssi_types.CredentialRole).includes(credentialRole)) {
269
269
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Invalid credentialRole: ${credentialRole}`);
270
270
  }
271
271
  const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({
@@ -319,7 +319,7 @@ var VcApiServer = class {
319
319
  this._opts = opts;
320
320
  this._express = args.expressSupport.express;
321
321
  this._router = import_express.default.Router();
322
- const context = (0, import_ssi_sdk5.agentContext)(agent);
322
+ const context = (0, import_ssi_sdk4.agentContext)(agent);
323
323
  const features = opts?.issueCredentialOpts?.enableFeatures ?? [
324
324
  "vc-issue",
325
325
  "vc-persist",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/vc-api-server.ts","../src/api-functions.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './vc-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport type { ExpressSupport } from '@sphereon/ssi-express-support'\nimport type { TAgent } from '@veramo/core'\n\nimport express, { type Express, Router } from 'express'\nimport {\n deleteCredentialEndpoint,\n getCredentialEndpoint,\n getCredentialsEndpoint,\n issueCredentialEndpoint,\n verifyCredentialEndpoint,\n} from './api-functions'\nimport type { IRequiredPlugins, IVCAPIOpts } from './types'\n\nexport class VcApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IVCAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IVCAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'issueCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredentials')\n copyGlobalAuthToEndpoint(opts, 'deleteCredential')\n copyGlobalAuthToEndpoint(opts, 'verifyCredential')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.issueCredentialOpts?.enableFeatures ?? ['vc-issue', 'vc-persist', 'vc-verify']\n console.log(`VC API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential endpoints\n if (features.includes('vc-issue')) {\n issueCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.issueCredential,\n issueCredentialOpts: opts?.issueCredentialOpts,\n })\n }\n if (features.includes('vc-persist')) {\n getCredentialEndpoint(this.router, context, opts?.endpointOpts?.getCredential)\n getCredentialsEndpoint(this.router, context, opts?.endpointOpts?.getCredentials)\n deleteCredentialEndpoint(this.router, context, opts?.endpointOpts?.deleteCredential) // not in spec.\n }\n if (features.includes('vc-verify')) {\n verifyCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.verifyCredential,\n fetchRemoteContexts: opts?.issueCredentialOpts?.fetchRemoteContexts,\n })\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IVCAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IVCAPIOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: { ...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint },\n }\n }\n}\n","import { checkAuth, type ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { isDidIdentifier, isIIdentifier } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { contextHasPlugin } from '@sphereon/ssi-sdk.agent-config'\nimport {\n AddCredentialArgs,\n CredentialCorrelationType,\n DocumentType,\n type FindDigitalCredentialArgs\n} from '@sphereon/ssi-sdk.credential-store'\nimport { extractIssuer } from '@sphereon/ssi-sdk.credential-vcdm'\nimport { CredentialRole } from '@sphereon/ssi-sdk.data-store'\nimport type { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport {\n CredentialMapper,\n CredentialProofFormat,\n isVcdm2Credential,\n OriginalVerifiableCredential\n} from '@sphereon/ssi-types'\nimport type { CredentialPayload, ProofFormat } from '@veramo/core'\nimport Debug from 'debug'\nimport { type Request, type Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport type {\n IIssueCredentialEndpointOpts,\n IRequiredContext,\n IVCAPIIssueOpts,\n IVerifyCredentialEndpointOpts\n} from './types'\n\nconst debug = Debug('sphereon:ssi-sdk:w3c-vc-api')\n\nexport function issueCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IIssueCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Issue credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/issue'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credential: CredentialPayload = request.body.credential\n const reqOpts = request.body.options ?? {}\n const inputFormat = reqOpts.proofFormat?.toLocaleLowerCase()\n let proofFormat: CredentialProofFormat | undefined = undefined\n if (inputFormat) {\n if (inputFormat === 'jwt') {\n proofFormat = 'jwt'\n } else if (inputFormat?.includes('jose') || inputFormat?.includes('vc+jwt')) {\n proofFormat = 'vc+jwt'\n } else if (inputFormat?.includes('ld')) {\n proofFormat = 'lds'\n }\n }\n if (proofFormat === undefined && opts?.issueCredentialOpts?.proofFormat) {\n proofFormat = opts.issueCredentialOpts.proofFormat.toLocaleLowerCase() as CredentialProofFormat\n }\n if (proofFormat === undefined) {\n if (isVcdm2Credential(credential)) {\n proofFormat = 'vc+jwt'\n } else {\n proofFormat = 'lds'\n }\n }\n\n if (!credential) {\n return sendErrorResponse(response, 400, 'No credential supplied')\n }\n if (!credential.id) {\n credential.id = `urn:uuid:${v4()}`\n }\n if (contextHasPlugin<IStatusListPlugin>(context, 'slAddStatusToCredential')) {\n // Add status list if enabled (and when the input has a credentialStatus object (can be empty))\n const credentialStatusVC = await context.agent.slAddStatusToCredential({ credential })\n if (credential.credentialStatus && !credential.credentialStatus.statusListCredential) {\n credential.credentialStatus = credentialStatusVC.credentialStatus\n }\n }\n\n const issueOpts: IVCAPIIssueOpts | undefined = opts?.issueCredentialOpts\n const vc = await context.agent.createVerifiableCredential({\n credential,\n proofFormat: proofFormat as ProofFormat,\n fetchRemoteContexts: issueOpts?.fetchRemoteContexts !== false,\n })\n const rawDocument = CredentialMapper.storedCredentialToOriginalFormat(vc as OriginalVerifiableCredential)\n const save = opts?.persistIssuedCredentials\n if (save) {\n const issuer = extractIssuer(credential)\n const identifier = await context.agent.identifierManagedGet({ identifier: issuer, issuer: issuer, vmRelationship: 'assertionMethod' })\n\n let issuerCorrelationId: string | undefined = identifier.issuer\n if (!issuerCorrelationId && isDidIdentifier(identifier.identifier)) {\n if (isIIdentifier(identifier.identifier)) {\n issuerCorrelationId = identifier.identifier.did\n } else if (typeof identifier.identifier === 'string') {\n issuerCorrelationId = identifier.identifier\n }\n }\n if (!issuerCorrelationId) {\n if (typeof vc.issuer === 'string') {\n issuerCorrelationId = vc.issuer\n } else if (typeof vc.issuer?.id === 'string') {\n issuerCorrelationId = vc.issuer.id\n } else {\n issuerCorrelationId = 'unknown'\n }\n }\n\n const dc: AddCredentialArgs = {\n credential: {\n credentialRole: CredentialRole.HOLDER,\n // tenantId: 'test-tenant',\n kmsKeyRef: identifier.kmsKeyRef,\n identifierMethod: identifier.method,\n issuerCorrelationId: issuerCorrelationId,\n issuerCorrelationType: CredentialCorrelationType.DID,\n rawDocument: typeof rawDocument === 'string' ? rawDocument : JSON.stringify(rawDocument),\n },\n }\n await context.agent.crsAddCredential(dc)\n }\n response.statusCode = 201\n return response.send({\n verifiableCredential: rawDocument,\n uniformCredential: CredentialMapper.toUniformCredential(vc as OriginalVerifiableCredential),\n })\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credentials endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const documentType = (request.query.documentType as DocumentType) || DocumentType.VC\n if (!Object.values(DocumentType).includes(documentType)) {\n return sendErrorResponse(response, 400, `Invalid documentType: ${documentType}`)\n }\n\n const filter: FindDigitalCredentialArgs = [\n {\n documentType: documentType,\n credentialRole: credentialRole,\n },\n ]\n const uniqueVCs = await context.agent.crsGetUniqueCredentials({ filter })\n response.statusCode = 202\n return response.send(uniqueVCs.map((uVC) => uVC.uniformVerifiableCredential))\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/:id'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 403, `id ${id} not found`)\n }\n response.statusCode = 200\n return response.send(vcInfo.uniformVerifiableCredential)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function verifyCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IVerifyCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Verify credential endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/verify', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const credential: OriginalVerifiableCredential = request.body.verifiableCredential\n const options = request.body.options\n if (!credential) {\n return sendErrorResponse(response, 400, 'No verifiable credential supplied')\n }\n const verifyResult = await context.agent.verifyCredential({\n ...options,\n credential,\n policies: {\n ...options?.policies,\n credentialStatus: false, // Do not use built-in. We have our own statusList implementations\n },\n fetchRemoteContexts: opts?.fetchRemoteContexts !== false,\n })\n\n response.statusCode = 200\n return response.send(verifyResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deleteCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Delete credential endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/credentials/:id', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = request.query.credentialRole as CredentialRole\n if (credentialRole === undefined) {\n return sendErrorResponse(response, 400, 'credentialRole query parameter is missing')\n }\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 404, `id ${id} not found`)\n }\n const success = await context.agent.crsDeleteCredentials({ filter: [{ hash: vcInfo.hash }] })\n if (success === 0) {\n return sendErrorResponse(response, 400, `Could not delete Verifiable Credential with id ${id}`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_sdk","debug","Debug","issueCredentialEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","credential","body","reqOpts","options","inputFormat","proofFormat","toLocaleLowerCase","undefined","includes","issueCredentialOpts","isVcdm2Credential","sendErrorResponse","id","v4","contextHasPlugin","credentialStatusVC","agent","slAddStatusToCredential","credentialStatus","statusListCredential","issueOpts","vc","createVerifiableCredential","fetchRemoteContexts","rawDocument","CredentialMapper","storedCredentialToOriginalFormat","save","persistIssuedCredentials","issuer","extractIssuer","identifier","identifierManagedGet","vmRelationship","issuerCorrelationId","isDidIdentifier","isIIdentifier","did","dc","credentialRole","CredentialRole","HOLDER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","Object","values","documentType","DocumentType","VC","filter","uniqueVCs","crsGetUniqueCredentials","map","uVC","uniformVerifiableCredential","getCredentialEndpoint","params","vcInfo","crsGetUniqueCredentialByIdOrHash","idOrHash","verifyCredentialEndpoint","verifyResult","verifyCredential","policies","deleteCredentialEndpoint","delete","success","crsDeleteCredentials","hash","VcApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","features","issueCredentialOpts","enableFeatures","console","log","JSON","stringify","includes","issueCredentialEndpoint","issueCredential","getCredentialEndpoint","getCredential","getCredentialsEndpoint","getCredentials","deleteCredentialEndpoint","deleteCredential","verifyCredentialEndpoint","verifyCredential","fetchRemoteContexts","use","basePath","key","endpoint"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/vc-api-server.ts","../src/api-functions.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './vc-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport type { ExpressSupport } from '@sphereon/ssi-express-support'\nimport type { TAgent } from '@veramo/core'\n\nimport express, { type Express, Router } from 'express'\nimport {\n deleteCredentialEndpoint,\n getCredentialEndpoint,\n getCredentialsEndpoint,\n issueCredentialEndpoint,\n verifyCredentialEndpoint,\n} from './api-functions'\nimport type { IRequiredPlugins, IVCAPIOpts } from './types'\n\nexport class VcApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IVCAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IVCAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'issueCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredentials')\n copyGlobalAuthToEndpoint(opts, 'deleteCredential')\n copyGlobalAuthToEndpoint(opts, 'verifyCredential')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.issueCredentialOpts?.enableFeatures ?? ['vc-issue', 'vc-persist', 'vc-verify']\n console.log(`VC API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential endpoints\n if (features.includes('vc-issue')) {\n issueCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.issueCredential,\n issueCredentialOpts: opts?.issueCredentialOpts,\n })\n }\n if (features.includes('vc-persist')) {\n getCredentialEndpoint(this.router, context, opts?.endpointOpts?.getCredential)\n getCredentialsEndpoint(this.router, context, opts?.endpointOpts?.getCredentials)\n deleteCredentialEndpoint(this.router, context, opts?.endpointOpts?.deleteCredential) // not in spec.\n }\n if (features.includes('vc-verify')) {\n verifyCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.verifyCredential,\n fetchRemoteContexts: opts?.issueCredentialOpts?.fetchRemoteContexts,\n })\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IVCAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IVCAPIOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: { ...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint },\n }\n }\n}\n","import { checkAuth, type ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { isDidIdentifier, isIIdentifier } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { contextHasPlugin } from '@sphereon/ssi-sdk.agent-config'\nimport { AddCredentialArgs, CredentialCorrelationType, DocumentType, type FindDigitalCredentialArgs } from '@sphereon/ssi-sdk.credential-store'\nimport { extractIssuer } from '@sphereon/ssi-sdk.credential-vcdm'\nimport { CredentialRole } from '@sphereon/ssi-types'\nimport type { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { CredentialMapper, CredentialProofFormat, isVcdm2Credential, OriginalVerifiableCredential } from '@sphereon/ssi-types'\nimport type { CredentialPayload, ProofFormat } from '@veramo/core'\nimport Debug from 'debug'\nimport { type Request, type Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport type { IIssueCredentialEndpointOpts, IRequiredContext, IVCAPIIssueOpts, IVerifyCredentialEndpointOpts } from './types'\n\nconst debug = Debug('sphereon:ssi-sdk:w3c-vc-api')\n\nexport function issueCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IIssueCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Issue credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/issue'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credential: CredentialPayload = request.body.credential\n const reqOpts = request.body.options ?? {}\n const inputFormat = reqOpts.proofFormat?.toLocaleLowerCase()\n let proofFormat: CredentialProofFormat | undefined = undefined\n if (inputFormat) {\n if (inputFormat === 'jwt') {\n proofFormat = 'jwt'\n } else if (inputFormat?.includes('jose') || inputFormat?.includes('vc+jwt')) {\n proofFormat = 'vc+jwt'\n } else if (inputFormat?.includes('ld')) {\n proofFormat = 'lds'\n }\n }\n if (proofFormat === undefined && opts?.issueCredentialOpts?.proofFormat) {\n proofFormat = opts.issueCredentialOpts.proofFormat.toLocaleLowerCase() as CredentialProofFormat\n }\n if (proofFormat === undefined) {\n if (isVcdm2Credential(credential)) {\n proofFormat = 'vc+jwt'\n } else {\n proofFormat = 'lds'\n }\n }\n\n if (!credential) {\n return sendErrorResponse(response, 400, 'No credential supplied')\n }\n if (!credential.id) {\n credential.id = `urn:uuid:${v4()}`\n }\n if (contextHasPlugin<IStatusListPlugin>(context, 'slAddStatusToCredential')) {\n // Add status list if enabled (and when the input has a credentialStatus object (can be empty))\n const credentialStatusVC = await context.agent.slAddStatusToCredential({ credential })\n if (credential.credentialStatus && !credential.credentialStatus.statusListCredential) {\n credential.credentialStatus = credentialStatusVC.credentialStatus\n }\n }\n\n const issueOpts: IVCAPIIssueOpts | undefined = opts?.issueCredentialOpts\n const vc = await context.agent.createVerifiableCredential({\n credential,\n proofFormat: proofFormat as ProofFormat,\n fetchRemoteContexts: issueOpts?.fetchRemoteContexts !== false,\n })\n const rawDocument = CredentialMapper.storedCredentialToOriginalFormat(vc as OriginalVerifiableCredential)\n const save = opts?.persistIssuedCredentials\n if (save) {\n const issuer = extractIssuer(credential)\n const identifier = await context.agent.identifierManagedGet({ identifier: issuer, issuer: issuer, vmRelationship: 'assertionMethod' })\n\n let issuerCorrelationId: string | undefined = identifier.issuer\n if (!issuerCorrelationId && isDidIdentifier(identifier.identifier)) {\n if (isIIdentifier(identifier.identifier)) {\n issuerCorrelationId = identifier.identifier.did\n } else if (typeof identifier.identifier === 'string') {\n issuerCorrelationId = identifier.identifier\n }\n }\n if (!issuerCorrelationId) {\n if (typeof vc.issuer === 'string') {\n issuerCorrelationId = vc.issuer\n } else if (typeof vc.issuer?.id === 'string') {\n issuerCorrelationId = vc.issuer.id\n } else {\n issuerCorrelationId = 'unknown'\n }\n }\n\n const dc: AddCredentialArgs = {\n credential: {\n credentialRole: CredentialRole.HOLDER,\n // tenantId: 'test-tenant',\n kmsKeyRef: identifier.kmsKeyRef,\n identifierMethod: identifier.method,\n issuerCorrelationId: issuerCorrelationId,\n issuerCorrelationType: CredentialCorrelationType.DID,\n rawDocument: typeof rawDocument === 'string' ? rawDocument : JSON.stringify(rawDocument),\n },\n }\n await context.agent.crsAddCredential(dc)\n }\n response.statusCode = 201\n return response.send({\n verifiableCredential: rawDocument,\n uniformCredential: CredentialMapper.toUniformCredential(vc as OriginalVerifiableCredential),\n })\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credentials endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const documentType = (request.query.documentType as DocumentType) || DocumentType.VC\n if (!Object.values(DocumentType).includes(documentType)) {\n return sendErrorResponse(response, 400, `Invalid documentType: ${documentType}`)\n }\n\n const filter: FindDigitalCredentialArgs = [\n {\n documentType: documentType,\n credentialRole: credentialRole,\n },\n ]\n const uniqueVCs = await context.agent.crsGetUniqueCredentials({ filter })\n response.statusCode = 202\n return response.send(uniqueVCs.map((uVC) => uVC.uniformVerifiableCredential))\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/:id'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 403, `id ${id} not found`)\n }\n response.statusCode = 200\n return response.send(vcInfo.uniformVerifiableCredential)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function verifyCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IVerifyCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Verify credential endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/verify', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const credential: OriginalVerifiableCredential = request.body.verifiableCredential\n const options = request.body.options\n if (!credential) {\n return sendErrorResponse(response, 400, 'No verifiable credential supplied')\n }\n const verifyResult = await context.agent.verifyCredential({\n ...options,\n credential,\n policies: {\n ...options?.policies,\n credentialStatus: false, // Do not use built-in. We have our own statusList implementations\n },\n fetchRemoteContexts: opts?.fetchRemoteContexts !== false,\n })\n\n response.statusCode = 200\n return response.send(verifyResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deleteCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Delete credential endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/credentials/:id', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = request.query.credentialRole as CredentialRole\n if (credentialRole === undefined) {\n return sendErrorResponse(response, 400, 'credentialRole query parameter is missing')\n }\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 404, `id ${id} not found`)\n }\n const success = await context.agent.crsDeleteCredentials({ filter: [{ hash: vcInfo.hash }] })\n if (success === 0) {\n return sendErrorResponse(response, 400, `Could not delete Verifiable Credential with id ${id}`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_sdk","import_ssi_types","debug","Debug","issueCredentialEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","credential","body","reqOpts","options","inputFormat","proofFormat","toLocaleLowerCase","undefined","includes","issueCredentialOpts","isVcdm2Credential","sendErrorResponse","id","v4","contextHasPlugin","credentialStatusVC","agent","slAddStatusToCredential","credentialStatus","statusListCredential","issueOpts","vc","createVerifiableCredential","fetchRemoteContexts","rawDocument","CredentialMapper","storedCredentialToOriginalFormat","save","persistIssuedCredentials","issuer","extractIssuer","identifier","identifierManagedGet","vmRelationship","issuerCorrelationId","isDidIdentifier","isIIdentifier","did","dc","credentialRole","CredentialRole","HOLDER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","Object","values","documentType","DocumentType","VC","filter","uniqueVCs","crsGetUniqueCredentials","map","uVC","uniformVerifiableCredential","getCredentialEndpoint","params","vcInfo","crsGetUniqueCredentialByIdOrHash","idOrHash","verifyCredentialEndpoint","verifyResult","verifyCredential","policies","deleteCredentialEndpoint","delete","success","crsDeleteCredentials","hash","VcApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","features","issueCredentialOpts","enableFeatures","console","log","JSON","stringify","includes","issueCredentialEndpoint","issueCredential","getCredentialEndpoint","getCredential","getCredentialsEndpoint","getCredentials","deleteCredentialEndpoint","deleteCredential","verifyCredentialEndpoint","verifyCredential","fetchRemoteContexts","use","basePath","key","endpoint"]}
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import { isDidIdentifier, isIIdentifier } from "@sphereon/ssi-sdk-ext.identifier
11
11
  import { contextHasPlugin } from "@sphereon/ssi-sdk.agent-config";
12
12
  import { CredentialCorrelationType, DocumentType } from "@sphereon/ssi-sdk.credential-store";
13
13
  import { extractIssuer } from "@sphereon/ssi-sdk.credential-vcdm";
14
- import { CredentialRole } from "@sphereon/ssi-sdk.data-store";
14
+ import { CredentialRole } from "@sphereon/ssi-types";
15
15
  import { CredentialMapper, isVcdm2Credential } from "@sphereon/ssi-types";
16
16
  import Debug from "debug";
17
17
  import { v4 } from "uuid";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vc-api-server.ts","../src/api-functions.ts"],"sourcesContent":["import { agentContext } from '@sphereon/ssi-sdk.core'\nimport type { ExpressSupport } from '@sphereon/ssi-express-support'\nimport type { TAgent } from '@veramo/core'\n\nimport express, { type Express, Router } from 'express'\nimport {\n deleteCredentialEndpoint,\n getCredentialEndpoint,\n getCredentialsEndpoint,\n issueCredentialEndpoint,\n verifyCredentialEndpoint,\n} from './api-functions'\nimport type { IRequiredPlugins, IVCAPIOpts } from './types'\n\nexport class VcApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IVCAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IVCAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'issueCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredentials')\n copyGlobalAuthToEndpoint(opts, 'deleteCredential')\n copyGlobalAuthToEndpoint(opts, 'verifyCredential')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.issueCredentialOpts?.enableFeatures ?? ['vc-issue', 'vc-persist', 'vc-verify']\n console.log(`VC API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential endpoints\n if (features.includes('vc-issue')) {\n issueCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.issueCredential,\n issueCredentialOpts: opts?.issueCredentialOpts,\n })\n }\n if (features.includes('vc-persist')) {\n getCredentialEndpoint(this.router, context, opts?.endpointOpts?.getCredential)\n getCredentialsEndpoint(this.router, context, opts?.endpointOpts?.getCredentials)\n deleteCredentialEndpoint(this.router, context, opts?.endpointOpts?.deleteCredential) // not in spec.\n }\n if (features.includes('vc-verify')) {\n verifyCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.verifyCredential,\n fetchRemoteContexts: opts?.issueCredentialOpts?.fetchRemoteContexts,\n })\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IVCAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IVCAPIOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: { ...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint },\n }\n }\n}\n","import { checkAuth, type ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { isDidIdentifier, isIIdentifier } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { contextHasPlugin } from '@sphereon/ssi-sdk.agent-config'\nimport {\n AddCredentialArgs,\n CredentialCorrelationType,\n DocumentType,\n type FindDigitalCredentialArgs\n} from '@sphereon/ssi-sdk.credential-store'\nimport { extractIssuer } from '@sphereon/ssi-sdk.credential-vcdm'\nimport { CredentialRole } from '@sphereon/ssi-sdk.data-store'\nimport type { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport {\n CredentialMapper,\n CredentialProofFormat,\n isVcdm2Credential,\n OriginalVerifiableCredential\n} from '@sphereon/ssi-types'\nimport type { CredentialPayload, ProofFormat } from '@veramo/core'\nimport Debug from 'debug'\nimport { type Request, type Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport type {\n IIssueCredentialEndpointOpts,\n IRequiredContext,\n IVCAPIIssueOpts,\n IVerifyCredentialEndpointOpts\n} from './types'\n\nconst debug = Debug('sphereon:ssi-sdk:w3c-vc-api')\n\nexport function issueCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IIssueCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Issue credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/issue'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credential: CredentialPayload = request.body.credential\n const reqOpts = request.body.options ?? {}\n const inputFormat = reqOpts.proofFormat?.toLocaleLowerCase()\n let proofFormat: CredentialProofFormat | undefined = undefined\n if (inputFormat) {\n if (inputFormat === 'jwt') {\n proofFormat = 'jwt'\n } else if (inputFormat?.includes('jose') || inputFormat?.includes('vc+jwt')) {\n proofFormat = 'vc+jwt'\n } else if (inputFormat?.includes('ld')) {\n proofFormat = 'lds'\n }\n }\n if (proofFormat === undefined && opts?.issueCredentialOpts?.proofFormat) {\n proofFormat = opts.issueCredentialOpts.proofFormat.toLocaleLowerCase() as CredentialProofFormat\n }\n if (proofFormat === undefined) {\n if (isVcdm2Credential(credential)) {\n proofFormat = 'vc+jwt'\n } else {\n proofFormat = 'lds'\n }\n }\n\n if (!credential) {\n return sendErrorResponse(response, 400, 'No credential supplied')\n }\n if (!credential.id) {\n credential.id = `urn:uuid:${v4()}`\n }\n if (contextHasPlugin<IStatusListPlugin>(context, 'slAddStatusToCredential')) {\n // Add status list if enabled (and when the input has a credentialStatus object (can be empty))\n const credentialStatusVC = await context.agent.slAddStatusToCredential({ credential })\n if (credential.credentialStatus && !credential.credentialStatus.statusListCredential) {\n credential.credentialStatus = credentialStatusVC.credentialStatus\n }\n }\n\n const issueOpts: IVCAPIIssueOpts | undefined = opts?.issueCredentialOpts\n const vc = await context.agent.createVerifiableCredential({\n credential,\n proofFormat: proofFormat as ProofFormat,\n fetchRemoteContexts: issueOpts?.fetchRemoteContexts !== false,\n })\n const rawDocument = CredentialMapper.storedCredentialToOriginalFormat(vc as OriginalVerifiableCredential)\n const save = opts?.persistIssuedCredentials\n if (save) {\n const issuer = extractIssuer(credential)\n const identifier = await context.agent.identifierManagedGet({ identifier: issuer, issuer: issuer, vmRelationship: 'assertionMethod' })\n\n let issuerCorrelationId: string | undefined = identifier.issuer\n if (!issuerCorrelationId && isDidIdentifier(identifier.identifier)) {\n if (isIIdentifier(identifier.identifier)) {\n issuerCorrelationId = identifier.identifier.did\n } else if (typeof identifier.identifier === 'string') {\n issuerCorrelationId = identifier.identifier\n }\n }\n if (!issuerCorrelationId) {\n if (typeof vc.issuer === 'string') {\n issuerCorrelationId = vc.issuer\n } else if (typeof vc.issuer?.id === 'string') {\n issuerCorrelationId = vc.issuer.id\n } else {\n issuerCorrelationId = 'unknown'\n }\n }\n\n const dc: AddCredentialArgs = {\n credential: {\n credentialRole: CredentialRole.HOLDER,\n // tenantId: 'test-tenant',\n kmsKeyRef: identifier.kmsKeyRef,\n identifierMethod: identifier.method,\n issuerCorrelationId: issuerCorrelationId,\n issuerCorrelationType: CredentialCorrelationType.DID,\n rawDocument: typeof rawDocument === 'string' ? rawDocument : JSON.stringify(rawDocument),\n },\n }\n await context.agent.crsAddCredential(dc)\n }\n response.statusCode = 201\n return response.send({\n verifiableCredential: rawDocument,\n uniformCredential: CredentialMapper.toUniformCredential(vc as OriginalVerifiableCredential),\n })\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credentials endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const documentType = (request.query.documentType as DocumentType) || DocumentType.VC\n if (!Object.values(DocumentType).includes(documentType)) {\n return sendErrorResponse(response, 400, `Invalid documentType: ${documentType}`)\n }\n\n const filter: FindDigitalCredentialArgs = [\n {\n documentType: documentType,\n credentialRole: credentialRole,\n },\n ]\n const uniqueVCs = await context.agent.crsGetUniqueCredentials({ filter })\n response.statusCode = 202\n return response.send(uniqueVCs.map((uVC) => uVC.uniformVerifiableCredential))\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/:id'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 403, `id ${id} not found`)\n }\n response.statusCode = 200\n return response.send(vcInfo.uniformVerifiableCredential)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function verifyCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IVerifyCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Verify credential endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/verify', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const credential: OriginalVerifiableCredential = request.body.verifiableCredential\n const options = request.body.options\n if (!credential) {\n return sendErrorResponse(response, 400, 'No verifiable credential supplied')\n }\n const verifyResult = await context.agent.verifyCredential({\n ...options,\n credential,\n policies: {\n ...options?.policies,\n credentialStatus: false, // Do not use built-in. We have our own statusList implementations\n },\n fetchRemoteContexts: opts?.fetchRemoteContexts !== false,\n })\n\n response.statusCode = 200\n return response.send(verifyResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deleteCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Delete credential endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/credentials/:id', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = request.query.credentialRole as CredentialRole\n if (credentialRole === undefined) {\n return sendErrorResponse(response, 400, 'credentialRole query parameter is missing')\n }\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 404, `id ${id} not found`)\n }\n const success = await context.agent.crsDeleteCredentials({ filter: [{ hash: vcInfo.hash }] })\n if (success === 0) {\n return sendErrorResponse(response, 400, `Could not delete Verifiable Credential with id ${id}`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n"],"mappings":";;;;AAAA,SAASA,oBAAoB;AAI7B,OAAOC,aAAuC;;;ACJ9C,SAASC,WAAqCC,yBAAyB;AACvE,SAASC,iBAAiBC,qBAAqB;AAC/C,SAASC,wBAAwB;AACjC,SAEEC,2BACAC,oBAEK;AACP,SAASC,qBAAqB;AAC9B,SAASC,sBAAsB;AAE/B,SACEC,kBAEAC,yBAEK;AAEP,OAAOC,WAAW;AAElB,SAASC,UAAU;AAQnB,IAAMC,QAAQC,MAAM,6BAAA;AAEb,SAASC,wBAAwBC,QAAgBC,SAA2BC,MAAmC;AACpH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,uCAAuC;AACnD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAE3BN,SAAOO,KAAKD,MAAME,UAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACpE,QAAI;AACF,YAAMC,aAAgCF,QAAQG,KAAKD;AACnD,YAAME,UAAUJ,QAAQG,KAAKE,WAAW,CAAC;AACzC,YAAMC,cAAcF,QAAQG,aAAaC,kBAAAA;AACzC,UAAID,cAAiDE;AACrD,UAAIH,aAAa;AACf,YAAIA,gBAAgB,OAAO;AACzBC,wBAAc;QAChB,WAAWD,aAAaI,SAAS,MAAA,KAAWJ,aAAaI,SAAS,QAAA,GAAW;AAC3EH,wBAAc;QAChB,WAAWD,aAAaI,SAAS,IAAA,GAAO;AACtCH,wBAAc;QAChB;MACF;AACA,UAAIA,gBAAgBE,UAAajB,MAAMmB,qBAAqBJ,aAAa;AACvEA,sBAAcf,KAAKmB,oBAAoBJ,YAAYC,kBAAiB;MACtE;AACA,UAAID,gBAAgBE,QAAW;AAC7B,YAAIG,kBAAkBV,UAAAA,GAAa;AACjCK,wBAAc;QAChB,OAAO;AACLA,wBAAc;QAChB;MACF;AAEA,UAAI,CAACL,YAAY;AACf,eAAOW,kBAAkBZ,UAAU,KAAK,wBAAA;MAC1C;AACA,UAAI,CAACC,WAAWY,IAAI;AAClBZ,mBAAWY,KAAK,YAAYC,GAAAA,CAAAA;MAC9B;AACA,UAAIC,iBAAoCzB,SAAS,yBAAA,GAA4B;AAE3E,cAAM0B,qBAAqB,MAAM1B,QAAQ2B,MAAMC,wBAAwB;UAAEjB;QAAW,CAAA;AACpF,YAAIA,WAAWkB,oBAAoB,CAAClB,WAAWkB,iBAAiBC,sBAAsB;AACpFnB,qBAAWkB,mBAAmBH,mBAAmBG;QACnD;MACF;AAEA,YAAME,YAAyC9B,MAAMmB;AACrD,YAAMY,KAAK,MAAMhC,QAAQ2B,MAAMM,2BAA2B;QACxDtB;QACAK;QACAkB,qBAAqBH,WAAWG,wBAAwB;MAC1D,CAAA;AACA,YAAMC,cAAcC,iBAAiBC,iCAAiCL,EAAAA;AACtE,YAAMM,OAAOrC,MAAMsC;AACnB,UAAID,MAAM;AACR,cAAME,SAASC,cAAc9B,UAAAA;AAC7B,cAAM+B,aAAa,MAAM1C,QAAQ2B,MAAMgB,qBAAqB;UAAED,YAAYF;UAAQA;UAAgBI,gBAAgB;QAAkB,CAAA;AAEpI,YAAIC,sBAA0CH,WAAWF;AACzD,YAAI,CAACK,uBAAuBC,gBAAgBJ,WAAWA,UAAU,GAAG;AAClE,cAAIK,cAAcL,WAAWA,UAAU,GAAG;AACxCG,kCAAsBH,WAAWA,WAAWM;UAC9C,WAAW,OAAON,WAAWA,eAAe,UAAU;AACpDG,kCAAsBH,WAAWA;UACnC;QACF;AACA,YAAI,CAACG,qBAAqB;AACxB,cAAI,OAAOb,GAAGQ,WAAW,UAAU;AACjCK,kCAAsBb,GAAGQ;UAC3B,WAAW,OAAOR,GAAGQ,QAAQjB,OAAO,UAAU;AAC5CsB,kCAAsBb,GAAGQ,OAAOjB;UAClC,OAAO;AACLsB,kCAAsB;UACxB;QACF;AAEA,cAAMI,KAAwB;UAC5BtC,YAAY;YACVuC,gBAAgBC,eAAeC;;YAE/BC,WAAWX,WAAWW;YACtBC,kBAAkBZ,WAAWa;YAC7BV;YACAW,uBAAuBC,0BAA0BC;YACjDvB,aAAa,OAAOA,gBAAgB,WAAWA,cAAcwB,KAAKC,UAAUzB,WAAAA;UAC9E;QACF;AACA,cAAMnC,QAAQ2B,MAAMkC,iBAAiBZ,EAAAA;MACvC;AACAvC,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAK;QACnBC,sBAAsB7B;QACtB8B,mBAAmB7B,iBAAiB8B,oBAAoBlC,EAAAA;MAC1D,CAAA;IACF,SAASmC,GAAG;AACV,aAAO7C,kBAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AAnGgBrE;AAqGT,SAASuE,uBAAuBtE,QAAgBC,SAA2BC,MAA0B;AAC1G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,sCAAsC;AAClD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOuE,IAAIjE,MAAME,UAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMwC,iBAAkBzC,QAAQ8D,MAAMrB,kBAAqCC,eAAeC;AAC1F,UAAI,CAACoB,OAAOC,OAAOtB,cAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,eAAO5B,kBAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMwB,eAAgBjE,QAAQ8D,MAAMG,gBAAiCC,aAAaC;AAClF,UAAI,CAACJ,OAAOC,OAAOE,YAAAA,EAAcxD,SAASuD,YAAAA,GAAe;AACvD,eAAOpD,kBAAkBZ,UAAU,KAAK,yBAAyBgE,YAAAA,EAAc;MACjF;AAEA,YAAMG,SAAoC;QACxC;UACEH;UACAxB;QACF;;AAEF,YAAM4B,YAAY,MAAM9E,QAAQ2B,MAAMoD,wBAAwB;QAAEF;MAAO,CAAA;AACvEnE,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAKe,UAAUE,IAAI,CAACC,QAAQA,IAAIC,2BAA2B,CAAA;IAC7E,SAASf,GAAG;AACV,aAAO7C,kBAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA/BgBE;AAiCT,SAASc,sBAAsBpF,QAAgBC,SAA2BC,MAA0B;AACzG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,qCAAqC;AACjD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOuE,IAAIjE,MAAME,UAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMa,KAAKd,QAAQ2E,OAAO7D;AAC1B,UAAI,CAACA,IAAI;AACP,eAAOD,kBAAkBZ,UAAU,KAAK,gBAAA;MAC1C;AACA,YAAMwC,iBAAkBzC,QAAQ8D,MAAMrB,kBAAqCC,eAAeC;AAC1F,UAAI,CAACoB,OAAOC,OAAOtB,cAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,eAAO5B,kBAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMmC,SAAS,MAAMrF,QAAQ2B,MAAM2D,iCAAiC;QAClEpC;QACAqC,UAAUhE;MACZ,CAAA;AACA,UAAI,CAAC8D,QAAQ;AACX,eAAO/D,kBAAkBZ,UAAU,KAAK,MAAMa,EAAAA,YAAc;MAC9D;AACAb,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAKsB,OAAOH,2BAA2B;IACzD,SAASf,GAAG;AACV,aAAO7C,kBAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA9BgBgB;AAgCT,SAASK,yBAAyBzF,QAAgBC,SAA2BC,MAAoC;AACtH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wCAAwC;AACpD;EACF;AACAL,SAAOO,KAAKL,MAAMI,QAAQ,uBAAuBE,UAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnG,QAAI;AACFd,YAAM+D,KAAKC,UAAUnD,QAAQG,MAAM,MAAM,CAAA,CAAA;AACzC,YAAMD,aAA2CF,QAAQG,KAAKoD;AAC9D,YAAMlD,UAAUL,QAAQG,KAAKE;AAC7B,UAAI,CAACH,YAAY;AACf,eAAOW,kBAAkBZ,UAAU,KAAK,mCAAA;MAC1C;AACA,YAAM+E,eAAe,MAAMzF,QAAQ2B,MAAM+D,iBAAiB;QACxD,GAAG5E;QACHH;QACAgF,UAAU;UACR,GAAG7E,SAAS6E;UACZ9D,kBAAkB;QACpB;QACAK,qBAAqBjC,MAAMiC,wBAAwB;MACrD,CAAA;AAEAxB,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAK0B,YAAAA;IACvB,SAAStB,GAAG;AACV,aAAO7C,kBAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA7BgBqB;AA+BT,SAASI,yBAAyB7F,QAAgBC,SAA2BC,MAA0B;AAC5G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wCAAwC;AACpD;EACF;AACAL,SAAO8F,OAAO5F,MAAMI,QAAQ,oBAAoBE,UAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AAClG,QAAI;AACF,YAAMa,KAAKd,QAAQ2E,OAAO7D;AAC1B,UAAI,CAACA,IAAI;AACP,eAAOD,kBAAkBZ,UAAU,KAAK,gBAAA;MAC1C;AACA,YAAMwC,iBAAiBzC,QAAQ8D,MAAMrB;AACrC,UAAIA,mBAAmBhC,QAAW;AAChC,eAAOI,kBAAkBZ,UAAU,KAAK,2CAAA;MAC1C;AACA,UAAI,CAAC8D,OAAOC,OAAOtB,cAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,eAAO5B,kBAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMmC,SAAS,MAAMrF,QAAQ2B,MAAM2D,iCAAiC;QAClEpC;QACAqC,UAAUhE;MACZ,CAAA;AACA,UAAI,CAAC8D,QAAQ;AACX,eAAO/D,kBAAkBZ,UAAU,KAAK,MAAMa,EAAAA,YAAc;MAC9D;AACA,YAAMuE,UAAU,MAAM9F,QAAQ2B,MAAMoE,qBAAqB;QAAElB,QAAQ;UAAC;YAAEmB,MAAMX,OAAOW;UAAK;;MAAG,CAAA;AAC3F,UAAIF,YAAY,GAAG;AACjB,eAAOxE,kBAAkBZ,UAAU,KAAK,kDAAkDa,EAAAA,EAAI;MAChG;AACAb,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAI;IACtB,SAASI,GAAG;AACV,aAAO7C,kBAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AApCgByB;;;ADtNT,IAAMK,cAAN,MAAMA;EAdb,OAcaA;;;EACX,IAAIC,SAAyB;AAC3B,WAAO,KAAKC;EACd;EAEiBC;EACAC;EACAC;EACAH;EAEjB,YAAYI,MAA8F;AACxG,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,SAAKF,SAASG;AACd,QAAIC,MAAMC,cAAcC,YAAY;AAClCC,+BAAyBH,MAAM,iBAAA;AAC/BG,+BAAyBH,MAAM,eAAA;AAC/BG,+BAAyBH,MAAM,gBAAA;AAC/BG,+BAAyBH,MAAM,kBAAA;AAC/BG,+BAAyBH,MAAM,kBAAA;IACjC;AAEA,SAAKH,QAAQG;AACb,SAAKL,WAAWG,KAAKM,eAAeC;AACpC,SAAKX,UAAUW,QAAQC,OAAM;AAE7B,UAAMC,UAAUC,aAAaT,KAAAA;AAE7B,UAAMU,WAAWT,MAAMU,qBAAqBC,kBAAkB;MAAC;MAAY;MAAc;;AACzFC,YAAQC,IAAI,kCAAkCC,KAAKC,UAAUN,QAAAA,CAAAA,EAAW;AAGxE,QAAIA,SAASO,SAAS,UAAA,GAAa;AACjCC,8BAAwB,KAAKxB,QAAQc,SAAS;QAC5C,GAAGP,MAAMC,cAAciB;QACvBR,qBAAqBV,MAAMU;MAC7B,CAAA;IACF;AACA,QAAID,SAASO,SAAS,YAAA,GAAe;AACnCG,4BAAsB,KAAK1B,QAAQc,SAASP,MAAMC,cAAcmB,aAAAA;AAChEC,6BAAuB,KAAK5B,QAAQc,SAASP,MAAMC,cAAcqB,cAAAA;AACjEC,+BAAyB,KAAK9B,QAAQc,SAASP,MAAMC,cAAcuB,gBAAAA;IACrE;AACA,QAAIf,SAASO,SAAS,WAAA,GAAc;AAClCS,+BAAyB,KAAKhC,QAAQc,SAAS;QAC7C,GAAGP,MAAMC,cAAcyB;QACvBC,qBAAqB3B,MAAMU,qBAAqBiB;MAClD,CAAA;IACF;AACA,SAAKhC,SAASiC,IAAI5B,MAAMC,cAAc4B,YAAY,IAAI,KAAKpC,MAAM;EACnE;EAEA,IAAIM,QAAkC;AACpC,WAAO,KAAKH;EACd;EAEA,IAAII,OAA+B;AACjC,WAAO,KAAKH;EACd;EAEA,IAAIQ,UAAmB;AACrB,WAAO,KAAKV;EACd;AACF;AAEA,SAASQ,yBAAyBH,MAAkB8B,KAAW;AAC7D,MAAI9B,MAAMC,cAAcC,YAAY;AAElCF,SAAKC,aAAa6B,GAAAA,IAAO;;MAEvB,GAAG9B,KAAKC,aAAa6B,GAAAA;;MAErBC,UAAU;QAAE,GAAG/B,KAAKC,aAAaC;QAAY,GAAGF,KAAKC,aAAa6B,GAAAA,GAAMC;MAAS;IACnF;EACF;AACF;AAVS5B;","names":["agentContext","express","checkAuth","sendErrorResponse","isDidIdentifier","isIIdentifier","contextHasPlugin","CredentialCorrelationType","DocumentType","extractIssuer","CredentialRole","CredentialMapper","isVcdm2Credential","Debug","v4","debug","Debug","issueCredentialEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","credential","body","reqOpts","options","inputFormat","proofFormat","toLocaleLowerCase","undefined","includes","issueCredentialOpts","isVcdm2Credential","sendErrorResponse","id","v4","contextHasPlugin","credentialStatusVC","agent","slAddStatusToCredential","credentialStatus","statusListCredential","issueOpts","vc","createVerifiableCredential","fetchRemoteContexts","rawDocument","CredentialMapper","storedCredentialToOriginalFormat","save","persistIssuedCredentials","issuer","extractIssuer","identifier","identifierManagedGet","vmRelationship","issuerCorrelationId","isDidIdentifier","isIIdentifier","did","dc","credentialRole","CredentialRole","HOLDER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","Object","values","documentType","DocumentType","VC","filter","uniqueVCs","crsGetUniqueCredentials","map","uVC","uniformVerifiableCredential","getCredentialEndpoint","params","vcInfo","crsGetUniqueCredentialByIdOrHash","idOrHash","verifyCredentialEndpoint","verifyResult","verifyCredential","policies","deleteCredentialEndpoint","delete","success","crsDeleteCredentials","hash","VcApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","features","issueCredentialOpts","enableFeatures","console","log","JSON","stringify","includes","issueCredentialEndpoint","issueCredential","getCredentialEndpoint","getCredential","getCredentialsEndpoint","getCredentials","deleteCredentialEndpoint","deleteCredential","verifyCredentialEndpoint","verifyCredential","fetchRemoteContexts","use","basePath","key","endpoint"]}
1
+ {"version":3,"sources":["../src/vc-api-server.ts","../src/api-functions.ts"],"sourcesContent":["import { agentContext } from '@sphereon/ssi-sdk.core'\nimport type { ExpressSupport } from '@sphereon/ssi-express-support'\nimport type { TAgent } from '@veramo/core'\n\nimport express, { type Express, Router } from 'express'\nimport {\n deleteCredentialEndpoint,\n getCredentialEndpoint,\n getCredentialsEndpoint,\n issueCredentialEndpoint,\n verifyCredentialEndpoint,\n} from './api-functions'\nimport type { IRequiredPlugins, IVCAPIOpts } from './types'\n\nexport class VcApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IVCAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IVCAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'issueCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredential')\n copyGlobalAuthToEndpoint(opts, 'getCredentials')\n copyGlobalAuthToEndpoint(opts, 'deleteCredential')\n copyGlobalAuthToEndpoint(opts, 'verifyCredential')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n const features = opts?.issueCredentialOpts?.enableFeatures ?? ['vc-issue', 'vc-persist', 'vc-verify']\n console.log(`VC API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential endpoints\n if (features.includes('vc-issue')) {\n issueCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.issueCredential,\n issueCredentialOpts: opts?.issueCredentialOpts,\n })\n }\n if (features.includes('vc-persist')) {\n getCredentialEndpoint(this.router, context, opts?.endpointOpts?.getCredential)\n getCredentialsEndpoint(this.router, context, opts?.endpointOpts?.getCredentials)\n deleteCredentialEndpoint(this.router, context, opts?.endpointOpts?.deleteCredential) // not in spec.\n }\n if (features.includes('vc-verify')) {\n verifyCredentialEndpoint(this.router, context, {\n ...opts?.endpointOpts?.verifyCredential,\n fetchRemoteContexts: opts?.issueCredentialOpts?.fetchRemoteContexts,\n })\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IVCAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IVCAPIOpts, key: string) {\n if (opts?.endpointOpts?.globalAuth) {\n // @ts-ignore\n opts.endpointOpts[key] = {\n // @ts-ignore\n ...opts.endpointOpts[key],\n // @ts-ignore\n endpoint: { ...opts.endpointOpts.globalAuth, ...opts.endpointOpts[key]?.endpoint },\n }\n }\n}\n","import { checkAuth, type ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { isDidIdentifier, isIIdentifier } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { contextHasPlugin } from '@sphereon/ssi-sdk.agent-config'\nimport { AddCredentialArgs, CredentialCorrelationType, DocumentType, type FindDigitalCredentialArgs } from '@sphereon/ssi-sdk.credential-store'\nimport { extractIssuer } from '@sphereon/ssi-sdk.credential-vcdm'\nimport { CredentialRole } from '@sphereon/ssi-types'\nimport type { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { CredentialMapper, CredentialProofFormat, isVcdm2Credential, OriginalVerifiableCredential } from '@sphereon/ssi-types'\nimport type { CredentialPayload, ProofFormat } from '@veramo/core'\nimport Debug from 'debug'\nimport { type Request, type Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport type { IIssueCredentialEndpointOpts, IRequiredContext, IVCAPIIssueOpts, IVerifyCredentialEndpointOpts } from './types'\n\nconst debug = Debug('sphereon:ssi-sdk:w3c-vc-api')\n\nexport function issueCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IIssueCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Issue credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/issue'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credential: CredentialPayload = request.body.credential\n const reqOpts = request.body.options ?? {}\n const inputFormat = reqOpts.proofFormat?.toLocaleLowerCase()\n let proofFormat: CredentialProofFormat | undefined = undefined\n if (inputFormat) {\n if (inputFormat === 'jwt') {\n proofFormat = 'jwt'\n } else if (inputFormat?.includes('jose') || inputFormat?.includes('vc+jwt')) {\n proofFormat = 'vc+jwt'\n } else if (inputFormat?.includes('ld')) {\n proofFormat = 'lds'\n }\n }\n if (proofFormat === undefined && opts?.issueCredentialOpts?.proofFormat) {\n proofFormat = opts.issueCredentialOpts.proofFormat.toLocaleLowerCase() as CredentialProofFormat\n }\n if (proofFormat === undefined) {\n if (isVcdm2Credential(credential)) {\n proofFormat = 'vc+jwt'\n } else {\n proofFormat = 'lds'\n }\n }\n\n if (!credential) {\n return sendErrorResponse(response, 400, 'No credential supplied')\n }\n if (!credential.id) {\n credential.id = `urn:uuid:${v4()}`\n }\n if (contextHasPlugin<IStatusListPlugin>(context, 'slAddStatusToCredential')) {\n // Add status list if enabled (and when the input has a credentialStatus object (can be empty))\n const credentialStatusVC = await context.agent.slAddStatusToCredential({ credential })\n if (credential.credentialStatus && !credential.credentialStatus.statusListCredential) {\n credential.credentialStatus = credentialStatusVC.credentialStatus\n }\n }\n\n const issueOpts: IVCAPIIssueOpts | undefined = opts?.issueCredentialOpts\n const vc = await context.agent.createVerifiableCredential({\n credential,\n proofFormat: proofFormat as ProofFormat,\n fetchRemoteContexts: issueOpts?.fetchRemoteContexts !== false,\n })\n const rawDocument = CredentialMapper.storedCredentialToOriginalFormat(vc as OriginalVerifiableCredential)\n const save = opts?.persistIssuedCredentials\n if (save) {\n const issuer = extractIssuer(credential)\n const identifier = await context.agent.identifierManagedGet({ identifier: issuer, issuer: issuer, vmRelationship: 'assertionMethod' })\n\n let issuerCorrelationId: string | undefined = identifier.issuer\n if (!issuerCorrelationId && isDidIdentifier(identifier.identifier)) {\n if (isIIdentifier(identifier.identifier)) {\n issuerCorrelationId = identifier.identifier.did\n } else if (typeof identifier.identifier === 'string') {\n issuerCorrelationId = identifier.identifier\n }\n }\n if (!issuerCorrelationId) {\n if (typeof vc.issuer === 'string') {\n issuerCorrelationId = vc.issuer\n } else if (typeof vc.issuer?.id === 'string') {\n issuerCorrelationId = vc.issuer.id\n } else {\n issuerCorrelationId = 'unknown'\n }\n }\n\n const dc: AddCredentialArgs = {\n credential: {\n credentialRole: CredentialRole.HOLDER,\n // tenantId: 'test-tenant',\n kmsKeyRef: identifier.kmsKeyRef,\n identifierMethod: identifier.method,\n issuerCorrelationId: issuerCorrelationId,\n issuerCorrelationType: CredentialCorrelationType.DID,\n rawDocument: typeof rawDocument === 'string' ? rawDocument : JSON.stringify(rawDocument),\n },\n }\n await context.agent.crsAddCredential(dc)\n }\n response.statusCode = 201\n return response.send({\n verifiableCredential: rawDocument,\n uniformCredential: CredentialMapper.toUniformCredential(vc as OriginalVerifiableCredential),\n })\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credentials endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const documentType = (request.query.documentType as DocumentType) || DocumentType.VC\n if (!Object.values(DocumentType).includes(documentType)) {\n return sendErrorResponse(response, 400, `Invalid documentType: ${documentType}`)\n }\n\n const filter: FindDigitalCredentialArgs = [\n {\n documentType: documentType,\n credentialRole: credentialRole,\n },\n ]\n const uniqueVCs = await context.agent.crsGetUniqueCredentials({ filter })\n response.statusCode = 202\n return response.send(uniqueVCs.map((uVC) => uVC.uniformVerifiableCredential))\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/credentials/:id'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = (request.query.credentialRole as CredentialRole) || CredentialRole.HOLDER\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 403, `id ${id} not found`)\n }\n response.statusCode = 200\n return response.send(vcInfo.uniformVerifiableCredential)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function verifyCredentialEndpoint(router: Router, context: IRequiredContext, opts?: IVerifyCredentialEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Verify credential endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/verify', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const credential: OriginalVerifiableCredential = request.body.verifiableCredential\n const options = request.body.options\n if (!credential) {\n return sendErrorResponse(response, 400, 'No verifiable credential supplied')\n }\n const verifyResult = await context.agent.verifyCredential({\n ...options,\n credential,\n policies: {\n ...options?.policies,\n credentialStatus: false, // Do not use built-in. We have our own statusList implementations\n },\n fetchRemoteContexts: opts?.fetchRemoteContexts !== false,\n })\n\n response.statusCode = 200\n return response.send(verifyResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deleteCredentialEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Delete credential endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/credentials/:id', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const id = request.params.id\n if (!id) {\n return sendErrorResponse(response, 400, 'no id provided')\n }\n const credentialRole = request.query.credentialRole as CredentialRole\n if (credentialRole === undefined) {\n return sendErrorResponse(response, 400, 'credentialRole query parameter is missing')\n }\n if (!Object.values(CredentialRole).includes(credentialRole)) {\n return sendErrorResponse(response, 400, `Invalid credentialRole: ${credentialRole}`)\n }\n\n const vcInfo = await context.agent.crsGetUniqueCredentialByIdOrHash({\n credentialRole: credentialRole,\n idOrHash: id,\n })\n if (!vcInfo) {\n return sendErrorResponse(response, 404, `id ${id} not found`)\n }\n const success = await context.agent.crsDeleteCredentials({ filter: [{ hash: vcInfo.hash }] })\n if (success === 0) {\n return sendErrorResponse(response, 400, `Could not delete Verifiable Credential with id ${id}`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n"],"mappings":"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","names":["agentContext","express","checkAuth","sendErrorResponse","isDidIdentifier","isIIdentifier","contextHasPlugin","CredentialCorrelationType","DocumentType","extractIssuer","CredentialRole","CredentialMapper","isVcdm2Credential","Debug","v4","debug","Debug","issueCredentialEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","credential","body","reqOpts","options","inputFormat","proofFormat","toLocaleLowerCase","undefined","includes","issueCredentialOpts","isVcdm2Credential","sendErrorResponse","id","v4","contextHasPlugin","credentialStatusVC","agent","slAddStatusToCredential","credentialStatus","statusListCredential","issueOpts","vc","createVerifiableCredential","fetchRemoteContexts","rawDocument","CredentialMapper","storedCredentialToOriginalFormat","save","persistIssuedCredentials","issuer","extractIssuer","identifier","identifierManagedGet","vmRelationship","issuerCorrelationId","isDidIdentifier","isIIdentifier","did","dc","credentialRole","CredentialRole","HOLDER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","Object","values","documentType","DocumentType","VC","filter","uniqueVCs","crsGetUniqueCredentials","map","uVC","uniformVerifiableCredential","getCredentialEndpoint","params","vcInfo","crsGetUniqueCredentialByIdOrHash","idOrHash","verifyCredentialEndpoint","verifyResult","verifyCredential","policies","deleteCredentialEndpoint","delete","success","crsDeleteCredentials","hash","VcApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","features","issueCredentialOpts","enableFeatures","console","log","JSON","stringify","includes","issueCredentialEndpoint","issueCredential","getCredentialEndpoint","getCredential","getCredentialsEndpoint","getCredentials","deleteCredentialEndpoint","deleteCredential","verifyCredentialEndpoint","verifyCredential","fetchRemoteContexts","use","basePath","key","endpoint"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.w3c-vc-api",
3
- "version": "0.34.1-next.3+6c49ea2f",
3
+ "version": "0.34.1-next.322+78f8dd31",
4
4
  "source": "src/index.ts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -23,25 +23,25 @@
23
23
  "start:dev": "ts-node __tests__/agent.ts"
24
24
  },
25
25
  "dependencies": {
26
- "@sphereon/did-auth-siop": "0.19.0",
27
- "@sphereon/ssi-express-support": "0.34.1-next.3+6c49ea2f",
28
- "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.1-next.3",
29
- "@sphereon/ssi-sdk-ext.jwt-service": "0.29.1-next.3",
30
- "@sphereon/ssi-sdk.agent-config": "0.34.1-next.3+6c49ea2f",
31
- "@sphereon/ssi-sdk.core": "0.34.1-next.3+6c49ea2f",
32
- "@sphereon/ssi-sdk.credential-store": "0.34.1-next.3+6c49ea2f",
33
- "@sphereon/ssi-sdk.credential-vcdm": "0.34.1-next.3+6c49ea2f",
34
- "@sphereon/ssi-sdk.kv-store-temp": "0.34.1-next.3+6c49ea2f",
35
- "@sphereon/ssi-sdk.presentation-exchange": "0.34.1-next.3+6c49ea2f",
36
- "@sphereon/ssi-sdk.vc-status-list": "0.34.1-next.3+6c49ea2f",
37
- "@sphereon/ssi-sdk.vc-status-list-issuer": "0.34.1-next.3+6c49ea2f",
38
- "@sphereon/ssi-types": "0.34.1-next.3+6c49ea2f",
26
+ "@sphereon/did-auth-siop": "0.19.1-next.234",
27
+ "@sphereon/ssi-express-support": "0.34.1-next.322+78f8dd31",
28
+ "@sphereon/ssi-sdk-ext.identifier-resolution": "0.34.1-next.322+78f8dd31",
29
+ "@sphereon/ssi-sdk-ext.jwt-service": "0.34.1-next.322+78f8dd31",
30
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-next.322+78f8dd31",
31
+ "@sphereon/ssi-sdk.core": "0.34.1-next.322+78f8dd31",
32
+ "@sphereon/ssi-sdk.credential-store": "0.34.1-next.322+78f8dd31",
33
+ "@sphereon/ssi-sdk.credential-vcdm": "0.34.1-next.322+78f8dd31",
34
+ "@sphereon/ssi-sdk.kv-store-temp": "0.34.1-next.322+78f8dd31",
35
+ "@sphereon/ssi-sdk.presentation-exchange": "0.34.1-next.322+78f8dd31",
36
+ "@sphereon/ssi-sdk.vc-status-list": "0.34.1-next.322+78f8dd31",
37
+ "@sphereon/ssi-sdk.vc-status-list-issuer": "0.34.1-next.322+78f8dd31",
38
+ "@sphereon/ssi-types": "0.34.1-next.322+78f8dd31",
39
39
  "@veramo/core": "4.2.0",
40
40
  "body-parser": "^1.20.2",
41
41
  "casbin": "^5.30.0",
42
42
  "cookie-parser": "^1.4.6",
43
43
  "cors": "^2.8.5",
44
- "cross-fetch": "^3.1.8",
44
+ "cross-fetch": "^4.1.0",
45
45
  "debug": "^4.3.5",
46
46
  "dotenv-flow": "^3.3.0",
47
47
  "express": "^4.19.2",
@@ -49,22 +49,23 @@
49
49
  "uuid": "^9.0.1"
50
50
  },
51
51
  "optionalDependencies": {
52
- "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-next.3+6c49ea2f",
53
- "@sphereon/ssi-sdk.credential-vcdm1-jwt-provider": "0.34.1-next.3+6c49ea2f",
54
- "@sphereon/ssi-sdk.credential-vcdm2-jose-provider": "0.34.1-next.3+6c49ea2f"
52
+ "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-next.322+78f8dd31",
53
+ "@sphereon/ssi-sdk.credential-vcdm1-jwt-provider": "0.34.1-next.322+78f8dd31",
54
+ "@sphereon/ssi-sdk.credential-vcdm2-jose-provider": "0.34.1-next.322+78f8dd31"
55
55
  },
56
56
  "devDependencies": {
57
- "@sphereon/did-provider-oyd": "0.29.1-next.3",
57
+ "@sphereon/did-provider-oyd": "0.34.1-next.322+78f8dd31",
58
58
  "@sphereon/did-uni-client": "^0.6.3",
59
- "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.29.1-next.3",
60
- "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.29.1-next.3",
61
- "@sphereon/ssi-sdk-ext.key-manager": "0.29.1-next.3",
62
- "@sphereon/ssi-sdk-ext.kms-local": "0.29.1-next.3",
59
+ "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.34.1-next.322+78f8dd31",
60
+ "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.34.1-next.322+78f8dd31",
61
+ "@sphereon/ssi-sdk-ext.key-manager": "0.34.1-next.322+78f8dd31",
62
+ "@sphereon/ssi-sdk-ext.kms-local": "0.34.1-next.322+78f8dd31",
63
63
  "@sphereon/ssi-sdk.agent-config": "workspace:*",
64
64
  "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "workspace:*",
65
65
  "@sphereon/ssi-sdk.credential-vcdm1-jwt-provider": "workspace:*",
66
66
  "@sphereon/ssi-sdk.credential-vcdm2-jose-provider": "workspace:*",
67
- "@sphereon/ssi-sdk.data-store": "0.34.1-next.3+6c49ea2f",
67
+ "@sphereon/ssi-sdk.data-store": "0.34.1-next.322+78f8dd31",
68
+ "@sphereon/ssi-sdk.data-store-types": "0.34.1-next.322+78f8dd31",
68
69
  "@types/body-parser": "^1.19.5",
69
70
  "@types/cookie-parser": "^1.4.7",
70
71
  "@types/cors": "^2.8.17",
@@ -116,5 +117,5 @@
116
117
  "W3C",
117
118
  "VC API"
118
119
  ],
119
- "gitHead": "6c49ea2f9c1bc61641ca2c98e3aa0a5b48018d91"
120
+ "gitHead": "78f8dd3157066ae8cf11d2ae50c8c3d8f43b8ed0"
120
121
  }
@@ -1,31 +1,16 @@
1
1
  import { checkAuth, type ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
2
2
  import { isDidIdentifier, isIIdentifier } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
3
  import { contextHasPlugin } from '@sphereon/ssi-sdk.agent-config'
4
- import {
5
- AddCredentialArgs,
6
- CredentialCorrelationType,
7
- DocumentType,
8
- type FindDigitalCredentialArgs
9
- } from '@sphereon/ssi-sdk.credential-store'
4
+ import { AddCredentialArgs, CredentialCorrelationType, DocumentType, type FindDigitalCredentialArgs } from '@sphereon/ssi-sdk.credential-store'
10
5
  import { extractIssuer } from '@sphereon/ssi-sdk.credential-vcdm'
11
- import { CredentialRole } from '@sphereon/ssi-sdk.data-store'
6
+ import { CredentialRole } from '@sphereon/ssi-types'
12
7
  import type { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'
13
- import {
14
- CredentialMapper,
15
- CredentialProofFormat,
16
- isVcdm2Credential,
17
- OriginalVerifiableCredential
18
- } from '@sphereon/ssi-types'
8
+ import { CredentialMapper, CredentialProofFormat, isVcdm2Credential, OriginalVerifiableCredential } from '@sphereon/ssi-types'
19
9
  import type { CredentialPayload, ProofFormat } from '@veramo/core'
20
10
  import Debug from 'debug'
21
11
  import { type Request, type Response, Router } from 'express'
22
12
  import { v4 } from 'uuid'
23
- import type {
24
- IIssueCredentialEndpointOpts,
25
- IRequiredContext,
26
- IVCAPIIssueOpts,
27
- IVerifyCredentialEndpointOpts
28
- } from './types'
13
+ import type { IIssueCredentialEndpointOpts, IRequiredContext, IVCAPIIssueOpts, IVerifyCredentialEndpointOpts } from './types'
29
14
 
30
15
  const debug = Debug('sphereon:ssi-sdk:w3c-vc-api')
31
16