@sphereon/ssi-sdk.w3c-vc-api 0.37.2-next.22 → 0.37.2-next.28
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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +24 -24
- package/src/api-functions.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -134,7 +134,7 @@ function issueCredentialEndpoint(router, context, opts) {
|
|
|
134
134
|
}
|
|
135
135
|
const dc = {
|
|
136
136
|
credential: {
|
|
137
|
-
credentialRole: import_ssi_types.CredentialRole.
|
|
137
|
+
credentialRole: import_ssi_types.CredentialRole.ISSUER,
|
|
138
138
|
// tenantId: 'test-tenant',
|
|
139
139
|
kmsKeyRef: identifier.kmsKeyRef,
|
|
140
140
|
identifierMethod: identifier.method,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 { 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"]}
|
|
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.ISSUER,\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;;;;;;;;;;;;ACAA,IAAAA,kBAA6B;AAI7B,qBAA8C;;;ACJ9C,iCAAuE;AACvE,yBAA+C;AAC/C,qBAAiC;AACjC,IAAAC,kBAA2G;AAC3G,IAAAA,kBAA8B;AAC9B,uBAA+B;AAE/B,IAAAC,oBAAyG;AAEzG,mBAAkB;AAElB,kBAAmB;AAGnB,IAAMC,YAAQC,aAAAA,SAAM,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,UAAME,sCAAUN,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,gBAAIG,qCAAkBV,UAAAA,GAAa;AACjCK,wBAAc;QAChB,OAAO;AACLA,wBAAc;QAChB;MACF;AAEA,UAAI,CAACL,YAAY;AACf,mBAAOW,8CAAkBZ,UAAU,KAAK,wBAAA;MAC1C;AACA,UAAI,CAACC,WAAWY,IAAI;AAClBZ,mBAAWY,KAAK,gBAAYC,gBAAAA,CAAAA;MAC9B;AACA,cAAIC,iCAAoCzB,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,mCAAiBC,iCAAiCL,EAAAA;AACtE,YAAMM,OAAOrC,MAAMsC;AACnB,UAAID,MAAM;AACR,cAAME,aAASC,+BAAc9B,UAAAA;AAC7B,cAAM+B,aAAa,MAAM1C,QAAQ2B,MAAMgB,qBAAqB;UAAED,YAAYF;UAAQA;UAAgBI,gBAAgB;QAAkB,CAAA;AAEpI,YAAIC,sBAA0CH,WAAWF;AACzD,YAAI,CAACK,2BAAuBC,oCAAgBJ,WAAWA,UAAU,GAAG;AAClE,kBAAIK,kCAAcL,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,gCAAeC;;YAE/BC,WAAWX,WAAWW;YACtBC,kBAAkBZ,WAAWa;YAC7BV;YACAW,uBAAuBC,0CAA0BC;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,mCAAiB8B,oBAAoBlC,EAAAA;MAC1D,CAAA;IACF,SAASmC,GAAG;AACV,iBAAO7C,8CAAkBZ,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,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMwC,iBAAkBzC,QAAQ8D,MAAMrB,kBAAqCC,gCAAeqB;AAC1F,UAAI,CAACC,OAAOC,OAAOvB,+BAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,mBAAO5B,8CAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMyB,eAAgBlE,QAAQ8D,MAAMI,gBAAiCC,6BAAaC;AAClF,UAAI,CAACJ,OAAOC,OAAOE,4BAAAA,EAAczD,SAASwD,YAAAA,GAAe;AACvD,mBAAOrD,8CAAkBZ,UAAU,KAAK,yBAAyBiE,YAAAA,EAAc;MACjF;AAEA,YAAMG,SAAoC;QACxC;UACEH;UACAzB;QACF;;AAEF,YAAM6B,YAAY,MAAM/E,QAAQ2B,MAAMqD,wBAAwB;QAAEF;MAAO,CAAA;AACvEpE,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAKgB,UAAUE,IAAI,CAACC,QAAQA,IAAIC,2BAA2B,CAAA;IAC7E,SAAShB,GAAG;AACV,iBAAO7C,8CAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA/BgBE;AAiCT,SAASe,sBAAsBrF,QAAgBC,SAA2BC,MAA0B;AACzG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,qCAAqC;AACjD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOuE,IAAIjE,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMa,KAAKd,QAAQ4E,OAAO9D;AAC1B,UAAI,CAACA,IAAI;AACP,mBAAOD,8CAAkBZ,UAAU,KAAK,gBAAA;MAC1C;AACA,YAAMwC,iBAAkBzC,QAAQ8D,MAAMrB,kBAAqCC,gCAAeqB;AAC1F,UAAI,CAACC,OAAOC,OAAOvB,+BAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,mBAAO5B,8CAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMoC,SAAS,MAAMtF,QAAQ2B,MAAM4D,iCAAiC;QAClErC;QACAsC,UAAUjE;MACZ,CAAA;AACA,UAAI,CAAC+D,QAAQ;AACX,mBAAOhE,8CAAkBZ,UAAU,KAAK,MAAMa,EAAAA,YAAc;MAC9D;AACAb,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAKuB,OAAOH,2BAA2B;IACzD,SAAShB,GAAG;AACV,iBAAO7C,8CAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA9BgBiB;AAgCT,SAASK,yBAAyB1F,QAAgBC,SAA2BC,MAAoC;AACtH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wCAAwC;AACpD;EACF;AACAL,SAAOO,KAAKL,MAAMI,QAAQ,2BAAuBE,sCAAUN,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,mBAAOW,8CAAkBZ,UAAU,KAAK,mCAAA;MAC1C;AACA,YAAMgF,eAAe,MAAM1F,QAAQ2B,MAAMgE,iBAAiB;QACxD,GAAG7E;QACHH;QACAiF,UAAU;UACR,GAAG9E,SAAS8E;UACZ/D,kBAAkB;QACpB;QACAK,qBAAqBjC,MAAMiC,wBAAwB;MACrD,CAAA;AAEAxB,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAK2B,YAAAA;IACvB,SAASvB,GAAG;AACV,iBAAO7C,8CAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AA7BgBsB;AA+BT,SAASI,yBAAyB9F,QAAgBC,SAA2BC,MAA0B;AAC5G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wCAAwC;AACpD;EACF;AACAL,SAAO+F,OAAO7F,MAAMI,QAAQ,wBAAoBE,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AAClG,QAAI;AACF,YAAMa,KAAKd,QAAQ4E,OAAO9D;AAC1B,UAAI,CAACA,IAAI;AACP,mBAAOD,8CAAkBZ,UAAU,KAAK,gBAAA;MAC1C;AACA,YAAMwC,iBAAiBzC,QAAQ8D,MAAMrB;AACrC,UAAIA,mBAAmBhC,QAAW;AAChC,mBAAOI,8CAAkBZ,UAAU,KAAK,2CAAA;MAC1C;AACA,UAAI,CAAC+D,OAAOC,OAAOvB,+BAAAA,EAAgBhC,SAAS+B,cAAAA,GAAiB;AAC3D,mBAAO5B,8CAAkBZ,UAAU,KAAK,2BAA2BwC,cAAAA,EAAgB;MACrF;AAEA,YAAMoC,SAAS,MAAMtF,QAAQ2B,MAAM4D,iCAAiC;QAClErC;QACAsC,UAAUjE;MACZ,CAAA;AACA,UAAI,CAAC+D,QAAQ;AACX,mBAAOhE,8CAAkBZ,UAAU,KAAK,MAAMa,EAAAA,YAAc;MAC9D;AACA,YAAMwE,UAAU,MAAM/F,QAAQ2B,MAAMqE,qBAAqB;QAAElB,QAAQ;UAAC;YAAEmB,MAAMX,OAAOW;UAAK;;MAAG,CAAA;AAC3F,UAAIF,YAAY,GAAG;AACjB,mBAAOzE,8CAAkBZ,UAAU,KAAK,kDAAkDa,EAAAA,EAAI;MAChG;AACAb,eAASoD,aAAa;AACtB,aAAOpD,SAASqD,KAAI;IACtB,SAASI,GAAG;AACV,iBAAO7C,8CAAkBZ,UAAU,KAAKyD,EAAEC,SAAmBD,CAAAA;IAC/D;EACF,CAAA;AACF;AApCgB0B;;;ADvMT,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,eAAAA,QAAQC,OAAM;AAE7B,UAAMC,cAAUC,8BAAaT,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":["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","ISSUER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","HOLDER","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
|
@@ -95,7 +95,7 @@ function issueCredentialEndpoint(router, context, opts) {
|
|
|
95
95
|
}
|
|
96
96
|
const dc = {
|
|
97
97
|
credential: {
|
|
98
|
-
credentialRole: CredentialRole.
|
|
98
|
+
credentialRole: CredentialRole.ISSUER,
|
|
99
99
|
// tenantId: 'test-tenant',
|
|
100
100
|
kmsKeyRef: identifier.kmsKeyRef,
|
|
101
101
|
identifierMethod: identifier.method,
|
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 { 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"]}
|
|
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.ISSUER,\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","ISSUER","kmsKeyRef","identifierMethod","method","issuerCorrelationType","CredentialCorrelationType","DID","JSON","stringify","crsAddCredential","statusCode","send","verifiableCredential","uniformCredential","toUniformCredential","e","message","getCredentialsEndpoint","get","query","HOLDER","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.37.2-next.
|
|
3
|
+
"version": "0.37.2-next.28+0fa1686a",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@sphereon/did-auth-siop": "0.20.1",
|
|
27
|
-
"@sphereon/ssi-express-support": "0.37.2-next.
|
|
28
|
-
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.37.2-next.
|
|
29
|
-
"@sphereon/ssi-sdk-ext.jwt-service": "0.37.2-next.
|
|
30
|
-
"@sphereon/ssi-sdk.agent-config": "0.37.2-next.
|
|
31
|
-
"@sphereon/ssi-sdk.core": "0.37.2-next.
|
|
32
|
-
"@sphereon/ssi-sdk.credential-store": "0.37.2-next.
|
|
33
|
-
"@sphereon/ssi-sdk.credential-vcdm": "0.37.2-next.
|
|
34
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.37.2-next.
|
|
35
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.37.2-next.
|
|
36
|
-
"@sphereon/ssi-sdk.vc-status-list": "0.37.2-next.
|
|
37
|
-
"@sphereon/ssi-sdk.vc-status-list-issuer": "0.37.2-next.
|
|
38
|
-
"@sphereon/ssi-types": "0.37.2-next.
|
|
27
|
+
"@sphereon/ssi-express-support": "0.37.2-next.28+0fa1686a",
|
|
28
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.37.2-next.28+0fa1686a",
|
|
29
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.37.2-next.28+0fa1686a",
|
|
30
|
+
"@sphereon/ssi-sdk.agent-config": "0.37.2-next.28+0fa1686a",
|
|
31
|
+
"@sphereon/ssi-sdk.core": "0.37.2-next.28+0fa1686a",
|
|
32
|
+
"@sphereon/ssi-sdk.credential-store": "0.37.2-next.28+0fa1686a",
|
|
33
|
+
"@sphereon/ssi-sdk.credential-vcdm": "0.37.2-next.28+0fa1686a",
|
|
34
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.37.2-next.28+0fa1686a",
|
|
35
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.37.2-next.28+0fa1686a",
|
|
36
|
+
"@sphereon/ssi-sdk.vc-status-list": "0.37.2-next.28+0fa1686a",
|
|
37
|
+
"@sphereon/ssi-sdk.vc-status-list-issuer": "0.37.2-next.28+0fa1686a",
|
|
38
|
+
"@sphereon/ssi-types": "0.37.2-next.28+0fa1686a",
|
|
39
39
|
"@veramo/core": "4.2.0",
|
|
40
40
|
"body-parser": "^1.20.2",
|
|
41
41
|
"casbin": "^5.30.0",
|
|
@@ -49,23 +49,23 @@
|
|
|
49
49
|
"uuid": "^9.0.1"
|
|
50
50
|
},
|
|
51
51
|
"optionalDependencies": {
|
|
52
|
-
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.37.2-next.
|
|
53
|
-
"@sphereon/ssi-sdk.credential-vcdm1-jwt-provider": "0.37.2-next.
|
|
54
|
-
"@sphereon/ssi-sdk.credential-vcdm2-jose-provider": "0.37.2-next.
|
|
52
|
+
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.37.2-next.28+0fa1686a",
|
|
53
|
+
"@sphereon/ssi-sdk.credential-vcdm1-jwt-provider": "0.37.2-next.28+0fa1686a",
|
|
54
|
+
"@sphereon/ssi-sdk.credential-vcdm2-jose-provider": "0.37.2-next.28+0fa1686a"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@sphereon/did-provider-oyd": "0.37.2-next.
|
|
57
|
+
"@sphereon/did-provider-oyd": "0.37.2-next.28+0fa1686a",
|
|
58
58
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
59
|
-
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.37.2-next.
|
|
60
|
-
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.37.2-next.
|
|
61
|
-
"@sphereon/ssi-sdk-ext.key-manager": "0.37.2-next.
|
|
62
|
-
"@sphereon/ssi-sdk-ext.kms-local": "0.37.2-next.
|
|
59
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.37.2-next.28+0fa1686a",
|
|
60
|
+
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.37.2-next.28+0fa1686a",
|
|
61
|
+
"@sphereon/ssi-sdk-ext.key-manager": "0.37.2-next.28+0fa1686a",
|
|
62
|
+
"@sphereon/ssi-sdk-ext.kms-local": "0.37.2-next.28+0fa1686a",
|
|
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.37.2-next.
|
|
68
|
-
"@sphereon/ssi-sdk.data-store-types": "0.37.2-next.
|
|
67
|
+
"@sphereon/ssi-sdk.data-store": "0.37.2-next.28+0fa1686a",
|
|
68
|
+
"@sphereon/ssi-sdk.data-store-types": "0.37.2-next.28+0fa1686a",
|
|
69
69
|
"@types/body-parser": "^1.19.5",
|
|
70
70
|
"@types/cookie-parser": "^1.4.7",
|
|
71
71
|
"@types/cors": "^2.8.17",
|
|
@@ -117,5 +117,5 @@
|
|
|
117
117
|
"W3C",
|
|
118
118
|
"VC API"
|
|
119
119
|
],
|
|
120
|
-
"gitHead": "
|
|
120
|
+
"gitHead": "0fa1686a6609f7a0aed8bbc8c7594639071cf88b"
|
|
121
121
|
}
|
package/src/api-functions.ts
CHANGED
|
@@ -93,7 +93,7 @@ export function issueCredentialEndpoint(router: Router, context: IRequiredContex
|
|
|
93
93
|
|
|
94
94
|
const dc: AddCredentialArgs = {
|
|
95
95
|
credential: {
|
|
96
|
-
credentialRole: CredentialRole.
|
|
96
|
+
credentialRole: CredentialRole.ISSUER,
|
|
97
97
|
// tenantId: 'test-tenant',
|
|
98
98
|
kmsKeyRef: identifier.kmsKeyRef,
|
|
99
99
|
identifierMethod: identifier.method,
|