@sphereon/ssi-sdk.vc-status-list-issuer-rest-api 0.34.1-feature.SSISDK.17.bitstring.sl.9 → 0.34.1-next.29

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
@@ -140,7 +140,14 @@ function getStatusListCredentialEndpoint(router, context, opts) {
140
140
  }
141
141
  __name(getStatusListCredentialEndpoint, "getStatusListCredentialEndpoint");
142
142
  function lookupType(details) {
143
- return details.type === import_ssi_types.StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type === import_ssi_types.StatusListType.BitstringStatusList ? "BitstringStatusListEntry" : details.type;
143
+ switch (details.type) {
144
+ case import_ssi_types.StatusListType.StatusList2021:
145
+ return "StatusList2021Entry";
146
+ case import_ssi_types.StatusListType.BitstringStatusList:
147
+ return "BitstringStatusListEntry";
148
+ default:
149
+ return details.type;
150
+ }
144
151
  }
145
152
  __name(lookupType, "lookupType");
146
153
  function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
@@ -199,15 +206,16 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
199
206
  const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0;
200
207
  const status = await (0, import_ssi_sdk.checkStatusIndexFromStatusListCredential)({
201
208
  statusListCredential: details.statusListCredential,
202
- ...details.type === import_ssi_types.StatusListType.StatusList2021 ? {
203
- statusPurpose: details.statusList2021?.statusPurpose
204
- } : {},
205
- ...details.type === import_ssi_types.StatusListType.BitstringStatusList ? {
206
- statusPurpose: details.bitstringStatusList?.statusPurpose
207
- } : {},
208
209
  type,
209
210
  id: details.id,
210
- statusListIndex: resultStatusIndex
211
+ statusListIndex: resultStatusIndex,
212
+ ...details.type === import_ssi_types.StatusListType.StatusList2021 && {
213
+ statusPurpose: details.statusList2021?.statusPurpose
214
+ },
215
+ ...details.type === import_ssi_types.StatusListType.BitstringStatusList && {
216
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
217
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
218
+ }
211
219
  });
212
220
  if (!entry) {
213
221
  entry = {
@@ -217,10 +225,12 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
217
225
  };
218
226
  }
219
227
  response.statusCode = 200;
220
- return response.json({
228
+ const result = {
221
229
  ...entry,
222
230
  status
223
- });
231
+ };
232
+ delete result.statusList;
233
+ return response.json(result);
224
234
  } catch (e) {
225
235
  return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
226
236
  }
@@ -271,9 +281,13 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
271
281
  const type = details.type === import_ssi_types.StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type;
272
282
  const status = await (0, import_ssi_sdk.checkStatusIndexFromStatusListCredential)({
273
283
  statusListCredential: details.statusListCredential,
274
- ...details.type === import_ssi_types.StatusListType.StatusList2021 ? {
284
+ ...details.type === import_ssi_types.StatusListType.StatusList2021 && {
275
285
  statusPurpose: details.statusList2021?.statusPurpose
276
- } : {},
286
+ },
287
+ ...details.type === import_ssi_types.StatusListType.BitstringStatusList && {
288
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
289
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
290
+ },
277
291
  type,
278
292
  id: details.id,
279
293
  statusListIndex
@@ -286,10 +300,12 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
286
300
  };
287
301
  }
288
302
  response.statusCode = 200;
289
- return response.json({
303
+ const result = {
290
304
  ...entry,
291
305
  status
292
- });
306
+ };
307
+ delete result.statusList;
308
+ return response.json(result);
293
309
  } catch (e) {
294
310
  return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
295
311
  }
@@ -370,7 +386,7 @@ function updateStatusEndpoint(router, context, opts) {
370
386
  }
371
387
  value = `${parseInt(updateItem.status)}`;
372
388
  }
373
- const updStatusListId = statusListId ?? statusListEntry.statusList?.id;
389
+ const updStatusListId = statusListId ?? ("statusList" in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId;
374
390
  if (!updStatusListId) {
375
391
  return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "statuslist id could not be determined");
376
392
  }
@@ -379,13 +395,21 @@ function updateStatusEndpoint(router, context, opts) {
379
395
  statusListId: updStatusListId,
380
396
  value
381
397
  });
398
+ const bitsPerStatus = "bitsPerStatus" in statusListEntry && typeof statusListEntry.bitsPerStatus === "number" ? statusListEntry.bitsPerStatus : void 0;
382
399
  statusListResult = await (0, import_ssi_sdk.updateStatusIndexFromStatusListCredential)({
383
400
  statusListCredential,
384
401
  statusListIndex: statusListEntry.statusListIndex,
402
+ ...bitsPerStatus && {
403
+ bitsPerStatus
404
+ },
385
405
  value: parseInt(value),
386
406
  keyRef: opts.keyRef
387
407
  }, context);
408
+ if (!statusListResult.correlationId) {
409
+ return Promise.reject(Error("Cannot update the statuslist, correlationId is missing from the status list result"));
410
+ }
388
411
  statusListResult = await driver.updateStatusList({
412
+ correlationId: statusListResult.correlationId,
389
413
  statusListCredential: statusListResult.statusListCredential
390
414
  });
391
415
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './statuslist-management-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\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?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\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?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\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(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, 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*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList ? { statusPurpose: details.bitstringStatusList?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({ statusListCredential: statusListResult.statusListCredential })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;ACAA,IAAAA,8BAAyD;AACzD,IAAAC,kBAA6B;AAI7B,qBAAyC;;;ACLzC,iCAA6C;AAC7C,qBAKO;AACP,IAAAC,kBAA0B;AAC1B,mBAAkB;;;AC6CX,IAAKC,mBAAAA,yBAAAA,mBAAAA;;;SAAAA;;AAKL,IAAKC,cAAAA,yBAAAA,cAAAA;;;SAAAA;;;;ADvCZ,uBAAqD;AAGrD,IAAMC,YAAQC,aAAAA,SAAM,8BAAA;AAEpB,SAASC,uBAAuBC,SAA2BC,mBAAyCC,UAAkB;AACpH,MAAIC;AAEJ,UAAQH,QAAQI,aAAW;IACzB,KAAK;IACL,KAAK;AACHD,gBAAUE,OAAOC,KAAKL,mBAA6B,OAAA;AACnD;IACF;AACEE,gBAAUF;EACd;AAEA,SAAOC,SAASK,OAAO,GAAA,EAAKC,UAAU,gBAAgBR,QAAQS,qBAAqB,EAAEC,KAAKP,OAAAA;AAC5F;AAbSJ;AAeT,SAASY,kBAAkBC,SAAgB;AACzC,QAAMC,WAAWD,QAAQE,QAAQ,mBAAA,GAAsBC,SAAAA,KAAcH,QAAQC;AAC7E,MAAIG,OAAOJ,QAAQE,QAAQ,kBAAA,GAAqBC,SAAAA,KAAcH,QAAQK,IAAI,MAAA;AAC1E,QAAMC,gBAAgBN,QAAQE,QAAQ,kBAAA,GAAqBC,SAAAA;AAE3D,MAAIG,iBAAiB,EAAEL,aAAa,WAAWK,kBAAkB,UAAU,EAAEL,aAAa,UAAUK,kBAAkB,OAAO;AAC3HF,YAAQ,IAAIE,aAAAA;EACd;AAEA,QAAMC,kBAAkBP,QAAQE,QAAQ,oBAAA,GAAuBC,SAAAA,KAAc;AAE7E,SAAO,GAAGF,QAAAA,MAAcG,IAAAA,GAAOG,eAAAA,GAAkBP,QAAQQ,YAAYC,MAAM,GAAA,EAAK,CAAA,EAAGC,QAAQ,uBAAuB,EAAA,CAAA;AACpH;AAZSX;AAcF,SAASY,4BAA4BC,QAAgBC,SAA2BC,MAAuC;AAC5H,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,6CAA6C;AACzD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAE3BN,SAAOO,KAAKD,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOrB,SAAkBV,aAAAA;AACpE,QAAI;AACF,YAAMgC,iBAA8CtB,QAAQuB,KAAKC;AACjE,UAAI,CAACF,gBAAgB;AACnB,mBAAOG,8CAAkBnC,UAAU,KAAK,gCAAA;MAC1C;AACA,YAAMF,UAAU,MAAMyB,QAAQa,MAAMC,mBAAmBL,cAAAA;AACvD,YAAMjC,oBAAoBD,QAAQwC;AAClC,aAAOzC,uBAAuBC,SAASC,mBAAmBC,QAAAA;IAC5D,SAASuC,GAAG;AACV,iBAAOJ,8CAAkBnC,UAAU,KAAMuC,EAAYC,SAASD,CAAAA;IAChE;EACF,CAAA;AACF;AApBgBlB;AAsBT,SAASoB,gCAAgCnB,QAAgBC,SAA2BC,MAAuC;AAChI,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,gDAAgD;AAC5D;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOP,IAAIa,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOrB,SAAkBV,aAAAA;AACnE,QAAI;AAGF,YAAM0C,gBAAgBhC,QAAQiC,MAAMD,eAAe7B,SAAAA;AACnD,YAAM+B,SAAS,UAAMC,2BAAU;QAC7B,GAAIH,gBAAgB;UAAEA;QAAc,IAAI;UAAEI,IAAIrC,kBAAkBC,OAAAA;QAAS;QACzEqC,QAAQvB,KAAKuB;MACf,CAAA;AACA,YAAMjD,UAAU,MAAM8C,OAAOI,cAAa;AAC1C,YAAMjD,oBAAoBD,QAAQwC;AAClC,aAAOzC,uBAAuBC,SAASC,mBAAmBC,QAAAA;IAC5D,SAASuC,GAAG;AACV,iBAAOJ,8CAAkBnC,UAAU,KAAMuC,EAAYC,SAASD,CAAAA;IAChE;EACF,CAAA;AACF;AAtBgBE;AAwBhB,SAASQ,WAAWnD,SAAyB;AAC3C,SAAOA,QAAQoD,SAASC,gCAAeC,iBACnC,wBACAtD,QAAQoD,SAASC,gCAAeE,sBAC9B,6BACAvD,QAAQoD;AAChB;AANSD;AAQF,SAASK,2CAA2ChC,QAAgBC,SAA2BC,MAAuC;AAC3I,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,6DAA6D;AACzE;EACF;AAEA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOP,IAAIa,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOrB,SAAkBV,aAAAA;AACnE,QAAI;AACF,YAAMuD,mBAAoB7C,QAAQiC,MAAMY,oBAAyCC,iBAAiBC;AAClG,YAAMC,cAAehD,QAAQiC,MAAMe,eAA+BC,YAAYC;AAE9E,UAAIC;AACJ,UAAIC;AACJ,UAAIC;AACJ,UAAIC;AAEJ,UAAIN,gBAAgBC,YAAYC,iBAAiB;AAC/C,YAAI;AACFC,4BAAkBI,OAAOC,SAASxD,QAAQyD,OAAOC,OAAO;AACxD,cAAI,CAACP,mBAAmBA,kBAAkB,GAAG;AAC3C,uBAAO1B,8CAAkBnC,UAAU,KAAK,yCAAyC;UACnF;QACF,SAASqE,OAAO;AACd,qBAAOlC,8CAAkBnC,UAAU,KAAK,yCAAyC;QACnF;MACF,OAAO;AACL8D,8BAAsBpD,QAAQyD,OAAOC;MACvC;AAEA,UAAIb,qBAAqBC,iBAAiBC,cAAc;AACtDM,uBAAerD,QAAQyD,OAAOJ;MAChC,OAAO;AACLC,kCAA0BtD,QAAQyD,OAAOJ;MAC3C;AAEA,YAAMnB,SAAS,UAAMC,2BAAU;QAC7B,GAAImB,0BAA0B;UAAEtB,eAAesB;QAAwB,IAAI;UAAElB,IAAIiB;QAAa;QAC9FhB,QAAQvB,KAAKuB;MACf,CAAA;AAEA,YAAMjD,UAAU,MAAM8C,OAAOI,cAAa;AAC1C,UAAIa,mBAAmBA,kBAAkB/D,QAAQwE,QAAQ;AACvD,mBAAOnC,8CAAkBnC,UAAU,KAAK,yCAAyC;MACnF;AAEA,UAAIuE,QAAQ,MAAM3B,OAAO4B,0BAA0B;QACjDT,cAAcjE,QAAQgD;QACtB,GAAIgB,sBAAsB;UAAEpB,eAAeoB;QAAoB,IAAI;UAAED;QAAgB;QACrFY,iBAAiB;MACnB,CAAA;AAEA,YAAMvB,OAAOD,WAAWnD,OAAAA;AACxB,YAAM4E,oBAAoBH,OAAOV,mBAAmBA,mBAAmB;AACvE,YAAMxD,SAAS,UAAMsE,yDAAyC;QAC5DrC,sBAAsBxC,QAAQwC;QAC9B,GAAIxC,QAAQoD,SAASC,gCAAeC,iBAAiB;UAAEwB,eAAe9E,QAAQ+E,gBAAgBD;QAAc,IAAI,CAAC;QACjH,GAAI9E,QAAQoD,SAASC,gCAAeE,sBAAsB;UAAEuB,eAAe9E,QAAQgF,qBAAqBF;QAAc,IAAI,CAAC;QAC3H1B;QACAJ,IAAIhD,QAAQgD;QACZe,iBAAiBa;MACnB,CAAA;AAEA,UAAI,CAACH,OAAO;AACVA,gBAAQ;UACNR,cAAcjE,QAAQgD;UACtBiC,OAAO;UACPlB,iBAAiBa;QACnB;MACF;AAEA1E,eAASgF,aAAa;AACtB,aAAOhF,SAASiF,KAAK;QAAE,GAAGV;QAAOlE;MAAO,CAAA;IAC1C,SAASkC,GAAG;AACV,iBAAOJ,8CAAkBnC,UAAU,KAAMuC,EAAYC,SAASD,CAAAA;IAChE;EACF,CAAA;AACF;AA7EgBe;AA+ET,SAAS4B,iDAAiD5D,QAAgBC,SAA2BC,MAAuC;AACjJ,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,6DAA6D;AACzE;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOP,IAAIa,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOrB,SAAkBV,aAAAA;AACnE,QAAI;AAEF,YAAMmF,qBAAqBzE,QAAQyD,OAAON;AAC1C,UAAIA;AACJ,UAAI;AACFA,0BAAkBI,OAAOC,SAASiB,kBAAAA;MACpC,SAASd,OAAO;AACd,mBAAOlC,8CAAkBnC,UAAU,KAAK,yCAAyC;MACnF;AACA,UAAI,CAAC6D,mBAAmBA,kBAAkB,GAAG;AAC3C,mBAAO1B,8CAAkBnC,UAAU,KAAK,yCAAyC;MACnF;AAEA,YAAMgE,0BAA0BtD,QAAQiC,MAAMD,eAAe7B,SAAAA;AAC7D,YAAM+B,SAAS,UAAMC,2BAAU;QAC7B,GAAImB,0BAA0B;UAAEtB,eAAesB;QAAwB,IAAI;UAAElB,IAAIrC,kBAAkBC,OAAAA;QAAS;QAC5GqC,QAAQvB,KAAKuB;MACf,CAAA;AACA,YAAMjD,UAAU,MAAM8C,OAAOI,cAAa;AAC1C,UAAIa,kBAAkB/D,QAAQwE,QAAQ;AACpC,mBAAOnC,8CAAkBnC,UAAU,KAAK,yCAAyC;MACnF;AAEA,YAAM8D,sBAAsBpD,QAAQiC,MAAMmB,qBAAqBjD,SAAAA;AAC/D,UAAI0D,QAAQ,MAAM3B,OAAO4B,0BAA0B;QACjDT,cAAcjE,QAAQgD;QACtB,GAAIgB,sBAAsB;UAAEpB,eAAeoB;QAAoB,IAAI;UAAED;QAAiC;QACtGY,iBAAiB;MACnB,CAAA;AACA,YAAMvB,OAAOpD,QAAQoD,SAASC,gCAAeC,iBAAiB,wBAAwBtD,QAAQoD;AAC9F,YAAM7C,SAAS,UAAMsE,yDAAyC;QAC5DrC,sBAAsBxC,QAAQwC;QAC9B,GAAIxC,QAAQoD,SAASC,gCAAeC,iBAAiB;UAAEwB,eAAe9E,QAAQ+E,gBAAgBD;QAAc,IAAI,CAAC;QACjH1B;QACAJ,IAAIhD,QAAQgD;QACZe;MACF,CAAA;AACA,UAAI,CAACU,OAAO;AAEVA,gBAAQ;UACNR,cAAcjE,QAAQgD;UACtBiC,OAAO;UACPlB;QACF;MACF;AACA7D,eAASgF,aAAa;AACtB,aAAOhF,SAASiF,KAAK;QAAE,GAAGV;QAAOlE;MAAO,CAAA;IAC1C,SAASkC,GAAG;AACV,iBAAOJ,8CAAkBnC,UAAU,KAAMuC,EAAYC,SAASD,CAAAA;IAChE;EACF,CAAA;AACF;AA1DgB2C;AA4DT,SAASE,qBAAqB9D,QAAgBC,SAA2BC,MAAqC;AACnH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,+CAA+C;AAC3D;EACF;AACAL,SAAOO,KAAKL,MAAMI,QAAQ,2BAAuBE,sCAAUN,MAAMO,QAAAA,GAAW,OAAOrB,SAAkBV,aAAAA;AACnG,QAAI;AACFL,YAAM0F,KAAKC,UAAU5E,QAAQuB,MAAM,MAAM,CAAA,CAAA;AACzC,YAAMsD,gBAAgB7E,QAAQuB;AAC9B,YAAM8B,eAAewB,cAAcxB,gBAAgBrD,QAAQiC,MAAMoB,cAAclD,SAAAA,KAAcW,KAAKuC;AAClG,YAAMC,0BAA0BuB,cAAcvB,2BAA2BtD,QAAQiC,MAAM6C,sBAAsB3E,SAAAA,KAAcW,KAAKkB;AAChI,YAAM+C,qBAAqBF,cAAcE,sBAAsB/E,QAAQiC,MAAM8C,oBAAoB5E,SAAAA;AAGjG,UAAI,CAACkD,gBAAgB,CAACC,yBAAyB;AAC7C,mBAAO7B,8CAAkBnC,UAAU,KAAK,sFAAA;MAC1C,WAAW,CAACuF,cAAcG,oBAAoBH,cAAcG,iBAAiBpB,WAAW,GAAG;AACzF,mBAAOnC,8CAAkBnC,UAAU,KAAK,gCAAA;MAC1C;AACA,YAAM4C,SAAS,UAAMC,2BAAU;QAC7B,GAAImB,0BAA0B;UAAEtB,eAAesB;QAAwB,IAAI;UAAElB,IAAIrC,kBAAkBC,OAAAA;QAAS;QAC5GqC,QAAQvB,KAAKuB;MACf,CAAA;AACA,UAAI4C,mBAAqC,MAAM/C,OAAOI,cAAa;AAGnE,UAAI4C;AACJ,UAAI,kBAAkBL,eAAe;AACnC,YAAI,CAACA,cAAcM,cAAc;AAC/B,qBAAO1D,8CAAkBnC,UAAU,KAAK,0BAAA;QAC1C;AAEA4F,0BAAkB,MAAMhD,OAAOkD,iCAAiC;UAC9D/B;UACAC;UACAyB;UACAI,cAAcN,cAAcM;UAC5BpB,iBAAiB;QACnB,CAAA;MACF,OAAO;AACLmB,0BAAkB,MAAMhD,OAAO4B,0BAA0B;UACvD,GAAImB,iBAAiB7C,MAAM;YAAEiB,cAAc4B,iBAAiB7C;UAAG;UAC/D,GAAI6C,iBAAiBjD,iBAAiB;YAAEsB,yBAAyB2B,iBAAiBjD;UAAc;UAChG,GAAI+C,qBAAqB;YAAEA;UAAmB,IAAI;YAAE5B,iBAAiB0B,cAAc1B;UAAgB;UACnGY,iBAAiB;QACnB,CAAA;MACF;AAEA,UAAI,CAACmB,iBAAiB;AACpB,cAAMG,aAAa,kBAAkBR,gBAAgBA,cAAcM,eAAe,SAASN,cAAc1B,eAAe;AACxH,mBAAO1B,8CAAkBnC,UAAU,KAAK,yBAAyB+F,UAAAA,kBAA4BhC,YAAAA,EAAc;MAC7G;AAEA,UAAIzB,uBAAuBqD,iBAAiBrD;AAC5C,iBAAW0D,cAAcT,cAAcG,kBAAkB;AACvD,YAAI,CAACM,WAAW3F,QAAQ;AACtB,qBAAO8B,8CAAkBnC,UAAU,KAAK,mEAAmE;QAC7G;AAEA,YAAI+E,QAAgB;AACpB,YAAIiB,WAAW3F,WAAW,OAAO2F,WAAW3F,OAAO4F,YAAW,MAAO,SAAS;AAC5ElB,kBAAQ;QACV,WAAWiB,WAAW3F,WAAW,OAAO2F,WAAW3F,OAAO4F,YAAW,MAAO,QAAQ;AAClF,cAAID,WAAW9C,SAASC,gCAAeC,gBAAgB;AAErD,uBAAOjB,8CAAkBnC,UAAU,KAAK,yDAAyDgG,WAAW3F,MAAM,EAAE;UACtH,WAAW6D,SAAS8B,WAAW3F,MAAM,IAAI,KAAK6D,SAAS8B,WAAW3F,MAAM,IAAI,KAAK;AAC/E,uBAAO8B,8CAAkBnC,UAAU,KAAK,yDAAyDgG,WAAW3F,MAAM,EAAE;UACtH;AACA0E,kBAAQ,GAAGb,SAAS8B,WAAW3F,MAAM,CAAA;QACvC;AAEA,cAAM6F,kBAAkBnC,gBAAgB6B,gBAAgB1D,YAAYY;AACpE,YAAI,CAACoD,iBAAiB;AACpB,qBAAO/D,8CAAkBnC,UAAU,KAAK,uCAAA;QAC1C;AACA,cAAM4C,OAAOuD,sBAAsB;UAAE,GAAGP;UAAiB7B,cAAcmC;UAAiBnB;QAAM,CAAA;AAG9FY,2BAAmB,UAAMS,0DACvB;UACE9D;UACAuB,iBAAiB+B,gBAAgB/B;UACjCkB,OAAOb,SAASa,KAAAA;UAChBsB,QAAQ7E,KAAK6E;QACf,GACA9E,OAAAA;AAEFoE,2BAAmB,MAAM/C,OAAO0D,iBAAiB;UAAEhE,sBAAsBqD,iBAAiBrD;QAAqB,CAAA;MACjH;AAEA,aAAOzC,uBAAuB8F,kBAAkBA,iBAAiBrD,sBAAsBtC,QAAAA;IACzF,SAASuC,GAAG;AACV,iBAAOJ,8CAAkBnC,UAAU,KAAMuC,EAAYC,SAASD,CAAAA;IAChE;EACF,CAAA;AACF;AAhGgB6C;;;ADtOT,IAAMmB,gCAAN,MAAMA;EAhBb,OAgBaA;;;EACX,IAAIC,SAAyB;AAC3B,WAAO,KAAKC;EACd;EAEiBC;EACAC;EACAC;EACAH;EAEjBI,YAAYC,MAAsH;AAChI,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,SAAKH,SAASI;AACd,QAAIC,MAAMC,cAAcC,YAAY;AAClCC,gEAAyB;QAAEH;QAAMI,KAAK;MAAwB,CAAA;AAC9DD,gEAAyB;QAAEH;QAAMI,KAAK;MAAmB,CAAA;AACzDD,gEAAyB;QAAEH;QAAMI,KAAK;MAAgB,CAAA;IACxD;AAEA,SAAKR,QAAQI;AACb,SAAKN,WAAWI,KAAKO,eAAeC;AACpC,SAAKb,UAAUa,eAAAA,QAAQC,OAAM;AAE7B,UAAMC,cAAUC,8BAAaV,KAAAA;AAE7B,UAAMW,WAAWV,MAAMW,kBAAkB;MAAC;MAA0B;MAAuB;;AAC3FC,YAAQC,IAAI,2CAA2CC,KAAKC,UAAUL,QAAAA,CAAAA,EAAW;AAGjF,QAAIA,SAASM,SAAS,wBAAA,GAA2B;AAC/CC,kCAA4B,KAAKzB,QAAQgB,SAASR,KAAKC,aAAaiB,gBAAgB;IACtF;AACA,QAAIR,SAASM,SAAS,qBAAA,GAAwB;AAC5CG,sCAAgC,KAAK3B,QAAQgB,SAASR,KAAKC,aAAamB,aAAa;AACrFC,iDAA2C,KAAK7B,QAAQgB,SAASR,KAAKC,aAAamB,aAAa;AAChGE,uDAAiD,KAAK9B,QAAQgB,SAASR,KAAKC,aAAamB,aAAa;IACxG;AACA,QAAIV,SAASM,SAAS,8BAAA,GAAiC;AACrDO,2BAAqB,KAAK/B,QAAQgB,SAASR,KAAKC,aAAauB,qBAAqB;IACpF;AACA,SAAK9B,SAAS+B,IAAIzB,MAAMC,cAAcyB,YAAY,IAAI,KAAKlC,MAAM;EACnE;EAEA,IAAIO,QAAkC;AACpC,WAAO,KAAKJ;EACd;EAEA,IAAIK,OAAoC;AACtC,WAAO,KAAKJ;EACd;EAEA,IAAIU,UAAmB;AACrB,WAAO,KAAKZ;EACd;AACF;","names":["import_ssi_express_support","import_ssi_sdk","import_ssi_sdk","StatusListIdType","EntryIdType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","value","statusCode","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","constructor","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './statuslist-management-api-server'\nexport * from './types'\nexport * from './api-functions'\n","import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\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?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\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?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\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(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, 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*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n switch (details.type) {\n case StatusListType.StatusList2021:\n return 'StatusList2021Entry'\n case StatusListType.BitstringStatusList:\n return 'BitstringStatusListEntry'\n default:\n return details.type\n }\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),\n ...(details.type === StatusListType.BitstringStatusList && {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }),\n })\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // the API caller requested the index status, not the entire status list which may be big. Filter it out\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),\n ...(details.type === StatusListType.BitstringStatusList && {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n const bitsPerStatus =\n 'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n ...(bitsPerStatus && { bitsPerStatus }),\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n\n if (!statusListResult.correlationId) {\n return Promise.reject(Error('Cannot update the statuslist, correlationId is missing from the status list result'))\n }\n statusListResult = await driver.updateStatusList({\n correlationId: statusListResult.correlationId,\n statusListCredential: statusListResult.statusListCredential,\n })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["import_ssi_express_support","import_ssi_sdk","import_ssi_sdk","StatusListIdType","EntryIdType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","bitsPerStatus","value","statusCode","result","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","undefined","updateStatusIndexFromStatusListCredential","keyRef","Promise","reject","Error","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
package/dist/index.js CHANGED
@@ -99,7 +99,14 @@ function getStatusListCredentialEndpoint(router, context, opts) {
99
99
  }
100
100
  __name(getStatusListCredentialEndpoint, "getStatusListCredentialEndpoint");
101
101
  function lookupType(details) {
102
- return details.type === StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type === StatusListType.BitstringStatusList ? "BitstringStatusListEntry" : details.type;
102
+ switch (details.type) {
103
+ case StatusListType.StatusList2021:
104
+ return "StatusList2021Entry";
105
+ case StatusListType.BitstringStatusList:
106
+ return "BitstringStatusListEntry";
107
+ default:
108
+ return details.type;
109
+ }
103
110
  }
104
111
  __name(lookupType, "lookupType");
105
112
  function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
@@ -158,15 +165,16 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
158
165
  const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0;
159
166
  const status = await checkStatusIndexFromStatusListCredential({
160
167
  statusListCredential: details.statusListCredential,
161
- ...details.type === StatusListType.StatusList2021 ? {
162
- statusPurpose: details.statusList2021?.statusPurpose
163
- } : {},
164
- ...details.type === StatusListType.BitstringStatusList ? {
165
- statusPurpose: details.bitstringStatusList?.statusPurpose
166
- } : {},
167
168
  type,
168
169
  id: details.id,
169
- statusListIndex: resultStatusIndex
170
+ statusListIndex: resultStatusIndex,
171
+ ...details.type === StatusListType.StatusList2021 && {
172
+ statusPurpose: details.statusList2021?.statusPurpose
173
+ },
174
+ ...details.type === StatusListType.BitstringStatusList && {
175
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
176
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
177
+ }
170
178
  });
171
179
  if (!entry) {
172
180
  entry = {
@@ -176,10 +184,12 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
176
184
  };
177
185
  }
178
186
  response.statusCode = 200;
179
- return response.json({
187
+ const result = {
180
188
  ...entry,
181
189
  status
182
- });
190
+ };
191
+ delete result.statusList;
192
+ return response.json(result);
183
193
  } catch (e) {
184
194
  return sendErrorResponse(response, 500, e.message, e);
185
195
  }
@@ -230,9 +240,13 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
230
240
  const type = details.type === StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type;
231
241
  const status = await checkStatusIndexFromStatusListCredential({
232
242
  statusListCredential: details.statusListCredential,
233
- ...details.type === StatusListType.StatusList2021 ? {
243
+ ...details.type === StatusListType.StatusList2021 && {
234
244
  statusPurpose: details.statusList2021?.statusPurpose
235
- } : {},
245
+ },
246
+ ...details.type === StatusListType.BitstringStatusList && {
247
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
248
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus
249
+ },
236
250
  type,
237
251
  id: details.id,
238
252
  statusListIndex
@@ -245,10 +259,12 @@ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts)
245
259
  };
246
260
  }
247
261
  response.statusCode = 200;
248
- return response.json({
262
+ const result = {
249
263
  ...entry,
250
264
  status
251
- });
265
+ };
266
+ delete result.statusList;
267
+ return response.json(result);
252
268
  } catch (e) {
253
269
  return sendErrorResponse(response, 500, e.message, e);
254
270
  }
@@ -329,7 +345,7 @@ function updateStatusEndpoint(router, context, opts) {
329
345
  }
330
346
  value = `${parseInt(updateItem.status)}`;
331
347
  }
332
- const updStatusListId = statusListId ?? statusListEntry.statusList?.id;
348
+ const updStatusListId = statusListId ?? ("statusList" in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId;
333
349
  if (!updStatusListId) {
334
350
  return sendErrorResponse(response, 400, "statuslist id could not be determined");
335
351
  }
@@ -338,13 +354,21 @@ function updateStatusEndpoint(router, context, opts) {
338
354
  statusListId: updStatusListId,
339
355
  value
340
356
  });
357
+ const bitsPerStatus = "bitsPerStatus" in statusListEntry && typeof statusListEntry.bitsPerStatus === "number" ? statusListEntry.bitsPerStatus : void 0;
341
358
  statusListResult = await updateStatusIndexFromStatusListCredential({
342
359
  statusListCredential,
343
360
  statusListIndex: statusListEntry.statusListIndex,
361
+ ...bitsPerStatus && {
362
+ bitsPerStatus
363
+ },
344
364
  value: parseInt(value),
345
365
  keyRef: opts.keyRef
346
366
  }, context);
367
+ if (!statusListResult.correlationId) {
368
+ return Promise.reject(Error("Cannot update the statuslist, correlationId is missing from the status list result"));
369
+ }
347
370
  statusListResult = await driver.updateStatusList({
371
+ correlationId: statusListResult.correlationId,
348
372
  statusListCredential: statusListResult.statusListCredential
349
373
  });
350
374
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\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?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\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?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\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(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, 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*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n return details.type === StatusListType.StatusList2021\n ? 'StatusList2021Entry'\n : details.type === StatusListType.BitstringStatusList\n ? 'BitstringStatusListEntry'\n : details.type\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n ...(details.type === StatusListType.BitstringStatusList ? { statusPurpose: details.bitstringStatusList?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n })\n\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n return response.json({ ...entry, status })\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n statusListResult = await driver.updateStatusList({ statusListCredential: statusListResult.statusListCredential })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["copyGlobalAuthToEndpoint","agentContext","express","checkAuth","sendErrorResponse","checkStatusIndexFromStatusListCredential","updateStatusIndexFromStatusListCredential","getDriver","Debug","StatusListIdType","EntryIdType","StatusListType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","value","statusCode","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","updateStatusIndexFromStatusListCredential","keyRef","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","constructor","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
1
+ {"version":3,"sources":["../src/statuslist-management-api-server.ts","../src/api-functions.ts","../src/types.ts"],"sourcesContent":["import { copyGlobalAuthToEndpoint, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { agentContext } from '@sphereon/ssi-sdk.core'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport {\n createNewStatusListEndpoint,\n getStatusListCredentialEndpoint,\n getStatusListCredentialIndexStatusEndpoint,\n getStatusListCredentialIndexStatusEndpointLegacy,\n updateStatusEndpoint,\n} from './api-functions'\nimport { IStatusListOpts } from './types'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\n\nexport class StatuslistManagementApiServer {\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?: IStatusListOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins & IStatusListPlugin>; expressSupport: ExpressSupport; opts: IStatusListOpts }) {\n const { agent, opts } = args\n this._agent = agent\n if (opts?.endpointOpts?.globalAuth) {\n copyGlobalAuthToEndpoint({ opts, key: 'vcApiCredentialStatus' })\n copyGlobalAuthToEndpoint({ opts, key: 'createStatusList' })\n copyGlobalAuthToEndpoint({ opts, key: 'getStatusList' })\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?.enableFeatures ?? ['status-list-management', 'status-list-hosting', 'w3c-vc-api-credential-status']\n console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`)\n\n // Credential Status (List) endpoints\n if (features.includes('status-list-management')) {\n createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList)\n }\n if (features.includes('status-list-hosting')) {\n getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)\n getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList)\n }\n if (features.includes('w3c-vc-api-credential-status')) {\n updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)\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(): IStatusListOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n\n/*\nfunction copyGlobalAuthToEndpoint(opts: IStatusListOpts, 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*/\n","import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport {\n checkStatusIndexFromStatusListCredential,\n CreateNewStatusListFuncArgs,\n StatusListResult,\n updateStatusIndexFromStatusListCredential,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport Debug from 'debug'\nimport { Request, Response, Router } from 'express'\nimport {\n EntryIdType,\n ICredentialStatusListEndpointOpts,\n IRequiredContext,\n IW3CredentialStatusEndpointOpts,\n StatusListIdType,\n UpdateIndexedCredentialStatusRequest,\n UpdateW3cCredentialStatusRequest,\n} from './types'\nimport { StatusListCredential, StatusListType } from '@sphereon/ssi-types'\nimport { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'\n\nconst debug = Debug('sphereon:ssi-sdk:status-list')\n\nfunction sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {\n let payload: Buffer | StatusListCredential\n\n switch (details.proofFormat) {\n case 'jwt':\n case 'cbor':\n payload = Buffer.from(statuslistPayload as string, 'ascii')\n break\n default:\n payload = statuslistPayload\n }\n\n return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)\n}\n\nfunction buildStatusListId(request: Request): string {\n const protocol = request.headers['x-forwarded-proto']?.toString() ?? request.protocol\n let host = request.headers['x-forwarded-host']?.toString() ?? request.get('host')\n const forwardedPort = request.headers['x-forwarded-port']?.toString()\n\n if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {\n host += `:${forwardedPort}`\n }\n\n const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''\n\n return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\\/status\\/index\\/.*/, '')}`\n}\n\nexport function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Create new status list endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListArgs: CreateNewStatusListFuncArgs = request.body.statusList\n if (!statusListArgs) {\n return sendErrorResponse(response, 400, 'No statusList details supplied')\n }\n const details = await context.agent.slCreateStatusList(statusListArgs)\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const correlationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n const statuslistPayload = details.statusListCredential\n return sendStatuslistResponse(details, statuslistPayload, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nfunction lookupType(details: StatusListResult) {\n switch (details.type) {\n case StatusListType.StatusList2021:\n return 'StatusList2021Entry'\n case StatusListType.BitstringStatusList:\n return 'BitstringStatusListEntry'\n default:\n return details.type\n }\n}\n\nexport function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/status-lists/:statusListId/status/entry-by-id/:entryId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const statusListIdType = (request.query.statusListIdType as StatusListIdType) ?? StatusListIdType.StatusListId\n const entryIdType = (request.query.entryIdType as EntryIdType) ?? EntryIdType.StatusListIndex\n\n let statusListIndex: number | undefined\n let entityCorrelationId: string | undefined\n let statusListId: string | undefined\n let statusListCorrelationId: string | undefined\n\n if (entryIdType === EntryIdType.StatusListIndex) {\n try {\n statusListIndex = Number.parseInt(request.params.entryId)\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n } else {\n entityCorrelationId = request.params.entryId\n }\n\n if (statusListIdType === StatusListIdType.StatusListId) {\n statusListId = request.params.statusListId\n } else {\n statusListCorrelationId = request.params.statusListId\n }\n\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: statusListId }),\n dbName: opts.dbName,\n })\n\n const details = await driver.getStatusList()\n if (statusListIndex && statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex }),\n errorOnNotFound: false,\n })\n\n const type = lookupType(details)\n const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n type,\n id: details.id,\n statusListIndex: resultStatusIndex,\n ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),\n ...(details.type === StatusListType.BitstringStatusList && {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }),\n })\n if (!entry) {\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex: resultStatusIndex,\n }\n }\n\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // the API caller requested the index status, not the entire status list which may be big. Filter it out\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get statusList credential index status endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/status-lists/:index/status/index/:statusListIndex'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n //todo: Check index against correlationId first. Then match originalUrl against statusList id\n const statusListIndexStr = request.params.statusListIndex\n let statusListIndex: number\n try {\n statusListIndex = Number.parseInt(statusListIndexStr)\n } catch (error) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n if (!statusListIndex || statusListIndex < 0) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n //const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these\n const statusListCorrelationId = request.query.correlationId?.toString()\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n const details = await driver.getStatusList()\n if (statusListIndex > details.length) {\n return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)\n }\n\n const entityCorrelationId = request.query.entityCorrelationId?.toString()\n let entry = await driver.getStatusListEntryByIndex({\n statusListId: details.id,\n ...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),\n errorOnNotFound: false,\n })\n const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\n const status = await checkStatusIndexFromStatusListCredential({\n statusListCredential: details.statusListCredential,\n ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),\n ...(details.type === StatusListType.BitstringStatusList && {\n statusPurpose: details.bitstringStatusList?.statusPurpose,\n bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,\n }),\n type,\n id: details.id,\n statusListIndex,\n })\n if (!entry) {\n // The fact we have nothing on it means the status is okay\n entry = {\n statusListId: details.id,\n value: '0',\n statusListIndex,\n }\n }\n response.statusCode = 200\n const result = { ...entry, status }\n delete result.statusList // we asked for the status, not the entire list\n return response.json(result)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n\nexport function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Update credential status endpoint is disabled`)\n return\n }\n router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n debug(JSON.stringify(request.body, null, 2))\n const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest\n const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId // TODO why query params when we have a JSON body ??\n const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId\n const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()\n\n // TODO: Move mostly to driver\n if (!statusListId && !statusListCorrelationId) {\n return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')\n } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {\n return sendErrorResponse(response, 400, 'No statusList updates supplied')\n }\n const driver = await getDriver({\n ...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),\n dbName: opts.dbName,\n })\n let statusListResult: StatusListResult = await driver.getStatusList()\n\n // Get status list entry based on request type\n let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined\n if ('credentialId' in updateRequest) {\n if (!updateRequest.credentialId) {\n return sendErrorResponse(response, 400, 'No credentialId supplied')\n }\n // unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance\n statusListEntry = await driver.getStatusListEntryByCredentialId({\n statusListId,\n statusListCorrelationId,\n entryCorrelationId,\n credentialId: updateRequest.credentialId,\n errorOnNotFound: true,\n })\n } else {\n statusListEntry = await driver.getStatusListEntryByIndex({\n ...(statusListResult.id && { statusListId: statusListResult.id }),\n ...(statusListResult.correlationId && { statusListCorrelationId: statusListResult.correlationId }),\n ...(entryCorrelationId ? { entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),\n errorOnNotFound: true,\n })\n }\n\n if (!statusListEntry) {\n const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`\n return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)\n }\n\n let statusListCredential = statusListResult.statusListCredential\n for (const updateItem of updateRequest.credentialStatus) {\n if (!updateItem.status) {\n return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)\n }\n\n let value: string = '1'\n if (updateItem.status === '0' || updateItem.status.toLowerCase() === 'false') {\n value = '0'\n } else if (updateItem.status !== '1' && updateItem.status.toLowerCase() !== 'true') {\n if (updateItem.type === StatusListType.StatusList2021) {\n // 2021 only allows 0 and 1\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {\n return sendErrorResponse(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`)\n }\n value = `${parseInt(updateItem.status)}`\n }\n\n const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry\n if (!updStatusListId) {\n return sendErrorResponse(response, 400, 'statuslist id could not be determined')\n }\n await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })\n const bitsPerStatus =\n 'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined\n\n // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well\n statusListResult = await updateStatusIndexFromStatusListCredential(\n {\n statusListCredential: statusListCredential,\n statusListIndex: statusListEntry.statusListIndex,\n ...(bitsPerStatus && { bitsPerStatus }),\n value: parseInt(value),\n keyRef: opts.keyRef,\n },\n context,\n )\n\n if (!statusListResult.correlationId) {\n return Promise.reject(Error('Cannot update the statuslist, correlationId is missing from the status list result'))\n }\n statusListResult = await driver.updateStatusList({\n correlationId: statusListResult.correlationId,\n statusListCredential: statusListResult.statusListCredential,\n })\n }\n\n return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)\n } catch (e) {\n return sendErrorResponse(response, 500, (e as Error).message, e)\n }\n })\n}\n","import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'\nimport { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list'\nimport { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'\nimport { StatusListType } from '@sphereon/ssi-types'\nimport { IAgentContext } from '@veramo/core'\n\nexport type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>\n\nexport interface IStatusListOpts {\n endpointOpts: IStatusListEndpointOpts\n enableFeatures?: statusListFeatures[] // Feature to enable. If not defined or empty, all features will be enabled\n}\n\nexport interface IStatusListEndpointOpts {\n basePath?: string\n globalAuth?: GenericAuthArgs\n vcApiCredentialStatus: IW3CredentialStatusEndpointOpts\n createStatusList: ICredentialStatusListEndpointOpts\n getStatusList: ICredentialStatusListEndpointOpts\n}\n\nexport type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting'\n\nexport interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {\n dbName: string\n}\n\nexport interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {\n statusListId?: string\n correlationId?: string\n keyRef?: string\n}\n\nexport interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {\n credentialId: string\n}\n\nexport interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {\n statusListIndex?: number\n}\n\ninterface UpdateCredentialStatusRequest {\n credentialStatus: UpdateCredentialStatusItem[]\n statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n entryCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default\n}\n\nexport interface UpdateCredentialStatusItem {\n type?: StatusListType // makes very little sense, but listed in the spec. Would expect a purpose\n status: string\n}\n\nexport enum StatusListIdType {\n StatusListId = 'StatusListId',\n StatusListCorrelationId = 'StatusListCorrelationId',\n}\n\nexport enum EntryIdType {\n StatusListIndex = 'StatusListIndex',\n EntryCorrelationId = 'StatusListCorrelationId',\n}\n"],"mappings":"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","names":["copyGlobalAuthToEndpoint","agentContext","express","checkAuth","sendErrorResponse","checkStatusIndexFromStatusListCredential","updateStatusIndexFromStatusListCredential","getDriver","Debug","StatusListIdType","EntryIdType","StatusListType","debug","Debug","sendStatuslistResponse","details","statuslistPayload","response","payload","proofFormat","Buffer","from","status","setHeader","statuslistContentType","send","buildStatusListId","request","protocol","headers","toString","host","get","forwardedPort","forwardedPrefix","originalUrl","split","replace","createNewStatusListEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","statusListArgs","body","statusList","sendErrorResponse","agent","slCreateStatusList","statusListCredential","e","message","getStatusListCredentialEndpoint","correlationId","query","driver","getDriver","id","dbName","getStatusList","lookupType","type","StatusListType","StatusList2021","BitstringStatusList","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","bitstringStatusList","bitsPerStatus","value","statusCode","result","json","getStatusListCredentialIndexStatusEndpointLegacy","statusListIndexStr","updateStatusEndpoint","JSON","stringify","updateRequest","statusListrelationId","entryCorrelationId","credentialStatus","statusListResult","statusListEntry","credentialId","getStatusListEntryByCredentialId","identifier","updateItem","toLowerCase","updStatusListId","updateStatusListEntry","undefined","updateStatusIndexFromStatusListCredential","keyRef","Promise","reject","Error","updateStatusList","StatuslistManagementApiServer","router","_router","_express","_agent","_opts","args","agent","opts","endpointOpts","globalAuth","copyGlobalAuthToEndpoint","key","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createNewStatusListEndpoint","createStatusList","getStatusListCredentialEndpoint","getStatusList","getStatusListCredentialIndexStatusEndpoint","getStatusListCredentialIndexStatusEndpointLegacy","updateStatusEndpoint","vcApiCredentialStatus","use","basePath"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.vc-status-list-issuer-rest-api",
3
3
  "description": "Sphereon SSI-SDK plugin for Status List management, like StatusList2021. Issuer drivers module",
4
- "version": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
4
+ "version": "0.34.1-next.29+2593a430",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -24,15 +24,15 @@
24
24
  "start:dev2": "node --experimental-specifier-resolution=node --loader ts-node/esm __tests__/agent.ts"
25
25
  },
26
26
  "dependencies": {
27
- "@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
28
- "@sphereon/ssi-sdk-ext.did-utils": "0.29.0",
29
- "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.0",
30
- "@sphereon/ssi-sdk-ext.jwt-service": "0.29.0",
31
- "@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
32
- "@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
33
- "@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
34
- "@sphereon/ssi-sdk.vc-status-list-issuer-drivers": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
35
- "@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
27
+ "@sphereon/ssi-express-support": "0.34.1-next.29+2593a430",
28
+ "@sphereon/ssi-sdk-ext.did-utils": "0.29.1-next.3",
29
+ "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.1-next.3",
30
+ "@sphereon/ssi-sdk-ext.jwt-service": "0.29.1-next.3",
31
+ "@sphereon/ssi-sdk.core": "0.34.1-next.29+2593a430",
32
+ "@sphereon/ssi-sdk.data-store": "0.34.1-next.29+2593a430",
33
+ "@sphereon/ssi-sdk.vc-status-list": "0.34.1-next.29+2593a430",
34
+ "@sphereon/ssi-sdk.vc-status-list-issuer-drivers": "0.34.1-next.29+2593a430",
35
+ "@sphereon/ssi-types": "0.34.1-next.29+2593a430",
36
36
  "@sphereon/vc-status-list": "7.0.0-next.0",
37
37
  "@veramo/core": "4.2.0",
38
38
  "debug": "^4.3.5",
@@ -44,10 +44,10 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@sphereon/did-uni-client": "^0.6.3",
47
- "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.29.0",
48
- "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.29.0",
49
- "@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
50
- "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.SSISDK.17.bitstring.sl.9+a052acba",
47
+ "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.29.1-next.3",
48
+ "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.29.1-next.3",
49
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-next.29+2593a430",
50
+ "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-next.29+2593a430",
51
51
  "@sphereon/ssi-sdk.data-store": "workspace:*",
52
52
  "@types/body-parser": "^1.19.5",
53
53
  "@types/cookie-parser": "^1.4.7",
@@ -91,5 +91,5 @@
91
91
  "SSI",
92
92
  "StatusList2021"
93
93
  ],
94
- "gitHead": "a052acbaa88acf4be22236ca3afaadd5b2821fe1"
94
+ "gitHead": "2593a430ac4faca47b620a3e12b297899518f2af"
95
95
  }
@@ -18,7 +18,7 @@ import {
18
18
  UpdateW3cCredentialStatusRequest,
19
19
  } from './types'
20
20
  import { StatusListCredential, StatusListType } from '@sphereon/ssi-types'
21
- import { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'
21
+ import { IBitstringStatusListEntryEntity, IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'
22
22
 
23
23
  const debug = Debug('sphereon:ssi-sdk:status-list')
24
24
 
@@ -98,11 +98,14 @@ export function getStatusListCredentialEndpoint(router: Router, context: IRequir
98
98
  }
99
99
 
100
100
  function lookupType(details: StatusListResult) {
101
- return details.type === StatusListType.StatusList2021
102
- ? 'StatusList2021Entry'
103
- : details.type === StatusListType.BitstringStatusList
104
- ? 'BitstringStatusListEntry'
105
- : details.type
101
+ switch (details.type) {
102
+ case StatusListType.StatusList2021:
103
+ return 'StatusList2021Entry'
104
+ case StatusListType.BitstringStatusList:
105
+ return 'BitstringStatusListEntry'
106
+ default:
107
+ return details.type
108
+ }
106
109
  }
107
110
 
108
111
  export function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {
@@ -161,13 +164,15 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
161
164
  const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0
162
165
  const status = await checkStatusIndexFromStatusListCredential({
163
166
  statusListCredential: details.statusListCredential,
164
- ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),
165
- ...(details.type === StatusListType.BitstringStatusList ? { statusPurpose: details.bitstringStatusList?.statusPurpose } : {}),
166
167
  type,
167
168
  id: details.id,
168
169
  statusListIndex: resultStatusIndex,
170
+ ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),
171
+ ...(details.type === StatusListType.BitstringStatusList && {
172
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
173
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,
174
+ }),
169
175
  })
170
-
171
176
  if (!entry) {
172
177
  entry = {
173
178
  statusListId: details.id,
@@ -177,7 +182,9 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
177
182
  }
178
183
 
179
184
  response.statusCode = 200
180
- return response.json({ ...entry, status })
185
+ const result = { ...entry, status }
186
+ delete result.statusList // the API caller requested the index status, not the entire status list which may be big. Filter it out
187
+ return response.json(result)
181
188
  } catch (e) {
182
189
  return sendErrorResponse(response, 500, (e as Error).message, e)
183
190
  }
@@ -223,7 +230,11 @@ export function getStatusListCredentialIndexStatusEndpointLegacy(router: Router,
223
230
  const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type
224
231
  const status = await checkStatusIndexFromStatusListCredential({
225
232
  statusListCredential: details.statusListCredential,
226
- ...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),
233
+ ...(details.type === StatusListType.StatusList2021 && { statusPurpose: details.statusList2021?.statusPurpose }),
234
+ ...(details.type === StatusListType.BitstringStatusList && {
235
+ statusPurpose: details.bitstringStatusList?.statusPurpose,
236
+ bitsPerStatus: details.bitstringStatusList?.bitsPerStatus,
237
+ }),
227
238
  type,
228
239
  id: details.id,
229
240
  statusListIndex,
@@ -237,7 +248,9 @@ export function getStatusListCredentialIndexStatusEndpointLegacy(router: Router,
237
248
  }
238
249
  }
239
250
  response.statusCode = 200
240
- return response.json({ ...entry, status })
251
+ const result = { ...entry, status }
252
+ delete result.statusList // we asked for the status, not the entire list
253
+ return response.json(result)
241
254
  } catch (e) {
242
255
  return sendErrorResponse(response, 500, (e as Error).message, e)
243
256
  }
@@ -270,7 +283,7 @@ export function updateStatusEndpoint(router: Router, context: IRequiredContext,
270
283
  let statusListResult: StatusListResult = await driver.getStatusList()
271
284
 
272
285
  // Get status list entry based on request type
273
- let statusListEntry: IStatusListEntryEntity | undefined
286
+ let statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined
274
287
  if ('credentialId' in updateRequest) {
275
288
  if (!updateRequest.credentialId) {
276
289
  return sendErrorResponse(response, 400, 'No credentialId supplied')
@@ -316,23 +329,33 @@ export function updateStatusEndpoint(router: Router, context: IRequiredContext,
316
329
  value = `${parseInt(updateItem.status)}`
317
330
  }
318
331
 
319
- const updStatusListId = statusListId ?? statusListEntry.statusList?.id // When input was statusListCorrelationId the statusList id should come from statusListEntry
332
+ const updStatusListId = statusListId ?? ('statusList' in statusListEntry && statusListEntry.statusList?.id) ?? statusListEntry?.statusListId // When input was statusListCorrelationId the statusList id should come from statusListEntry
320
333
  if (!updStatusListId) {
321
334
  return sendErrorResponse(response, 400, 'statuslist id could not be determined')
322
335
  }
323
336
  await driver.updateStatusListEntry({ ...statusListEntry, statusListId: updStatusListId, value })
337
+ const bitsPerStatus =
338
+ 'bitsPerStatus' in statusListEntry && typeof statusListEntry.bitsPerStatus === 'number' ? statusListEntry.bitsPerStatus : undefined
324
339
 
325
340
  // todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well
326
341
  statusListResult = await updateStatusIndexFromStatusListCredential(
327
342
  {
328
343
  statusListCredential: statusListCredential,
329
344
  statusListIndex: statusListEntry.statusListIndex,
345
+ ...(bitsPerStatus && { bitsPerStatus }),
330
346
  value: parseInt(value),
331
347
  keyRef: opts.keyRef,
332
348
  },
333
349
  context,
334
350
  )
335
- statusListResult = await driver.updateStatusList({ statusListCredential: statusListResult.statusListCredential })
351
+
352
+ if (!statusListResult.correlationId) {
353
+ return Promise.reject(Error('Cannot update the statuslist, correlationId is missing from the status list result'))
354
+ }
355
+ statusListResult = await driver.updateStatusList({
356
+ correlationId: statusListResult.correlationId,
357
+ statusListCredential: statusListResult.statusListCredential,
358
+ })
336
359
  }
337
360
 
338
361
  return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response)