@sphereon/ssi-sdk.vc-status-list-issuer-rest-api 0.33.1-next.3 → 0.33.1-next.68

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 ADDED
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/index.ts
32
+ var index_exports = {};
33
+ __export(index_exports, {
34
+ EntryIdType: () => EntryIdType,
35
+ StatusListIdType: () => StatusListIdType,
36
+ StatuslistManagementApiServer: () => StatuslistManagementApiServer,
37
+ createNewStatusListEndpoint: () => createNewStatusListEndpoint,
38
+ getStatusListCredentialEndpoint: () => getStatusListCredentialEndpoint,
39
+ getStatusListCredentialIndexStatusEndpoint: () => getStatusListCredentialIndexStatusEndpoint,
40
+ getStatusListCredentialIndexStatusEndpointLegacy: () => getStatusListCredentialIndexStatusEndpointLegacy,
41
+ updateStatusEndpoint: () => updateStatusEndpoint
42
+ });
43
+ module.exports = __toCommonJS(index_exports);
44
+
45
+ // src/statuslist-management-api-server.ts
46
+ var import_ssi_express_support2 = require("@sphereon/ssi-express-support");
47
+ var import_ssi_sdk3 = require("@sphereon/ssi-sdk.core");
48
+ var import_express = __toESM(require("express"), 1);
49
+
50
+ // src/api-functions.ts
51
+ var import_ssi_express_support = require("@sphereon/ssi-express-support");
52
+ var import_ssi_sdk = require("@sphereon/ssi-sdk.vc-status-list");
53
+ var import_ssi_sdk2 = require("@sphereon/ssi-sdk.vc-status-list-issuer-drivers");
54
+ var import_debug = __toESM(require("debug"), 1);
55
+
56
+ // src/types.ts
57
+ var StatusListIdType = /* @__PURE__ */ function(StatusListIdType2) {
58
+ StatusListIdType2["StatusListId"] = "StatusListId";
59
+ StatusListIdType2["StatusListCorrelationId"] = "StatusListCorrelationId";
60
+ return StatusListIdType2;
61
+ }({});
62
+ var EntryIdType = /* @__PURE__ */ function(EntryIdType2) {
63
+ EntryIdType2["StatusListIndex"] = "StatusListIndex";
64
+ EntryIdType2["EntryCorrelationId"] = "StatusListCorrelationId";
65
+ return EntryIdType2;
66
+ }({});
67
+
68
+ // src/api-functions.ts
69
+ var import_ssi_types = require("@sphereon/ssi-types");
70
+ var debug = (0, import_debug.default)("sphereon:ssi-sdk:status-list");
71
+ function sendStatuslistResponse(details, statuslistPayload, response) {
72
+ let payload;
73
+ switch (details.proofFormat) {
74
+ case "jwt":
75
+ case "cbor":
76
+ payload = Buffer.from(statuslistPayload, "ascii");
77
+ break;
78
+ default:
79
+ payload = statuslistPayload;
80
+ }
81
+ return response.status(200).setHeader("Content-Type", details.statuslistContentType).send(payload);
82
+ }
83
+ __name(sendStatuslistResponse, "sendStatuslistResponse");
84
+ function buildStatusListId(request) {
85
+ const protocol = request.headers["x-forwarded-proto"]?.toString() ?? request.protocol;
86
+ let host = request.headers["x-forwarded-host"]?.toString() ?? request.get("host");
87
+ const forwardedPort = request.headers["x-forwarded-port"]?.toString();
88
+ if (forwardedPort && !(protocol === "https" && forwardedPort === "443") && !(protocol === "http" && forwardedPort === "80")) {
89
+ host += `:${forwardedPort}`;
90
+ }
91
+ const forwardedPrefix = request.headers["x-forwarded-prefix"]?.toString() ?? "";
92
+ return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split("?")[0].replace(/\/status\/index\/.*/, "")}`;
93
+ }
94
+ __name(buildStatusListId, "buildStatusListId");
95
+ function createNewStatusListEndpoint(router, context, opts) {
96
+ if (opts?.enabled === false) {
97
+ console.log(`Create new status list endpoint is disabled`);
98
+ return;
99
+ }
100
+ const path = opts?.path ?? "/status-lists";
101
+ router.post(path, (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
102
+ try {
103
+ const statusListArgs = request.body.statusList;
104
+ if (!statusListArgs) {
105
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "No statusList details supplied");
106
+ }
107
+ const details = await context.agent.slCreateStatusList(statusListArgs);
108
+ const statuslistPayload = details.statusListCredential;
109
+ return sendStatuslistResponse(details, statuslistPayload, response);
110
+ } catch (e) {
111
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
112
+ }
113
+ });
114
+ }
115
+ __name(createNewStatusListEndpoint, "createNewStatusListEndpoint");
116
+ function getStatusListCredentialEndpoint(router, context, opts) {
117
+ if (opts?.enabled === false) {
118
+ console.log(`Get statusList credential endpoint is disabled`);
119
+ return;
120
+ }
121
+ const path = opts?.path ?? "/status-lists/:index";
122
+ router.get(path, (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
123
+ try {
124
+ const correlationId = request.query.correlationId?.toString();
125
+ const driver = await (0, import_ssi_sdk2.getDriver)({
126
+ ...correlationId ? {
127
+ correlationId
128
+ } : {
129
+ id: buildStatusListId(request)
130
+ },
131
+ dbName: opts.dbName
132
+ });
133
+ const details = await driver.getStatusList();
134
+ const statuslistPayload = details.statusListCredential;
135
+ return sendStatuslistResponse(details, statuslistPayload, response);
136
+ } catch (e) {
137
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
138
+ }
139
+ });
140
+ }
141
+ __name(getStatusListCredentialEndpoint, "getStatusListCredentialEndpoint");
142
+ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
143
+ if (opts?.enabled === false) {
144
+ console.log(`Get statusList credential index status endpoint is disabled`);
145
+ return;
146
+ }
147
+ const path = opts?.path ?? "/status-lists/:statusListId/status/entry-by-id/:entryId";
148
+ router.get(path, (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
149
+ try {
150
+ const statusListIdType = request.query.statusListIdType ?? StatusListIdType.StatusListId;
151
+ const entryIdType = request.query.entryIdType ?? EntryIdType.StatusListIndex;
152
+ let statusListIndex;
153
+ let entityCorrelationId;
154
+ let statusListId;
155
+ let statusListCorrelationId;
156
+ if (entryIdType === EntryIdType.StatusListIndex) {
157
+ try {
158
+ statusListIndex = Number.parseInt(request.params.entryId);
159
+ if (!statusListIndex || statusListIndex < 0) {
160
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
161
+ }
162
+ } catch (error) {
163
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
164
+ }
165
+ } else {
166
+ entityCorrelationId = request.params.entryId;
167
+ }
168
+ if (statusListIdType === StatusListIdType.StatusListId) {
169
+ statusListId = request.params.statusListId;
170
+ } else {
171
+ statusListCorrelationId = request.params.statusListId;
172
+ }
173
+ const driver = await (0, import_ssi_sdk2.getDriver)({
174
+ ...statusListCorrelationId ? {
175
+ correlationId: statusListCorrelationId
176
+ } : {
177
+ id: statusListId
178
+ },
179
+ dbName: opts.dbName
180
+ });
181
+ const details = await driver.getStatusList();
182
+ if (statusListIndex && statusListIndex > details.length) {
183
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
184
+ }
185
+ let entry = await driver.getStatusListEntryByIndex({
186
+ statusListId: details.id,
187
+ ...entityCorrelationId ? {
188
+ correlationId: entityCorrelationId
189
+ } : {
190
+ statusListIndex
191
+ },
192
+ errorOnNotFound: false
193
+ });
194
+ const type = details.type === import_ssi_types.StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type;
195
+ const resultStatusIndex = entry?.statusListIndex ?? statusListIndex ?? 0;
196
+ const status = await (0, import_ssi_sdk.checkStatusIndexFromStatusListCredential)({
197
+ statusListCredential: details.statusListCredential,
198
+ ...details.type === import_ssi_types.StatusListType.StatusList2021 ? {
199
+ statusPurpose: details.statusList2021?.statusPurpose
200
+ } : {},
201
+ type,
202
+ id: details.id,
203
+ statusListIndex: resultStatusIndex
204
+ });
205
+ if (!entry) {
206
+ entry = {
207
+ statusListId: details.id,
208
+ value: "0",
209
+ statusListIndex: resultStatusIndex
210
+ };
211
+ }
212
+ response.statusCode = 200;
213
+ return response.json({
214
+ ...entry,
215
+ status
216
+ });
217
+ } catch (e) {
218
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
219
+ }
220
+ });
221
+ }
222
+ __name(getStatusListCredentialIndexStatusEndpoint, "getStatusListCredentialIndexStatusEndpoint");
223
+ function getStatusListCredentialIndexStatusEndpointLegacy(router, context, opts) {
224
+ if (opts?.enabled === false) {
225
+ console.log(`Get statusList credential index status endpoint is disabled`);
226
+ return;
227
+ }
228
+ const path = opts?.path ?? "/status-lists/:index/status/index/:statusListIndex";
229
+ router.get(path, (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
230
+ try {
231
+ const statusListIndexStr = request.params.statusListIndex;
232
+ let statusListIndex;
233
+ try {
234
+ statusListIndex = Number.parseInt(statusListIndexStr);
235
+ } catch (error) {
236
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
237
+ }
238
+ if (!statusListIndex || statusListIndex < 0) {
239
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
240
+ }
241
+ const statusListCorrelationId = request.query.correlationId?.toString();
242
+ const driver = await (0, import_ssi_sdk2.getDriver)({
243
+ ...statusListCorrelationId ? {
244
+ correlationId: statusListCorrelationId
245
+ } : {
246
+ id: buildStatusListId(request)
247
+ },
248
+ dbName: opts.dbName
249
+ });
250
+ const details = await driver.getStatusList();
251
+ if (statusListIndex > details.length) {
252
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
253
+ }
254
+ const entityCorrelationId = request.query.entityCorrelationId?.toString();
255
+ let entry = await driver.getStatusListEntryByIndex({
256
+ statusListId: details.id,
257
+ ...entityCorrelationId ? {
258
+ correlationId: entityCorrelationId
259
+ } : {
260
+ statusListIndex
261
+ },
262
+ errorOnNotFound: false
263
+ });
264
+ const type = details.type === import_ssi_types.StatusListType.StatusList2021 ? "StatusList2021Entry" : details.type;
265
+ const status = await (0, import_ssi_sdk.checkStatusIndexFromStatusListCredential)({
266
+ statusListCredential: details.statusListCredential,
267
+ ...details.type === import_ssi_types.StatusListType.StatusList2021 ? {
268
+ statusPurpose: details.statusList2021?.statusPurpose
269
+ } : {},
270
+ type,
271
+ id: details.id,
272
+ statusListIndex
273
+ });
274
+ if (!entry) {
275
+ entry = {
276
+ statusListId: details.id,
277
+ value: "0",
278
+ statusListIndex
279
+ };
280
+ }
281
+ response.statusCode = 200;
282
+ return response.json({
283
+ ...entry,
284
+ status
285
+ });
286
+ } catch (e) {
287
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
288
+ }
289
+ });
290
+ }
291
+ __name(getStatusListCredentialIndexStatusEndpointLegacy, "getStatusListCredentialIndexStatusEndpointLegacy");
292
+ function updateStatusEndpoint(router, context, opts) {
293
+ if (opts?.enabled === false) {
294
+ console.log(`Update credential status endpoint is disabled`);
295
+ return;
296
+ }
297
+ router.post(opts?.path ?? "/credentials/status", (0, import_ssi_express_support.checkAuth)(opts?.endpoint), async (request, response) => {
298
+ try {
299
+ debug(JSON.stringify(request.body, null, 2));
300
+ const updateRequest = request.body;
301
+ const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId;
302
+ const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListrelationId?.toString() ?? opts.correlationId;
303
+ const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString();
304
+ if (!statusListId && !statusListCorrelationId) {
305
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "No statusList id or correlation Id provided or deduced for the API or in the request");
306
+ } else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {
307
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "No statusList updates supplied");
308
+ }
309
+ const driver = await (0, import_ssi_sdk2.getDriver)({
310
+ ...statusListCorrelationId ? {
311
+ correlationId: statusListCorrelationId
312
+ } : {
313
+ id: buildStatusListId(request)
314
+ },
315
+ dbName: opts.dbName
316
+ });
317
+ let statusListResult = await driver.getStatusList();
318
+ let statusListEntry;
319
+ if ("credentialId" in updateRequest) {
320
+ if (!updateRequest.credentialId) {
321
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "No credentialId supplied");
322
+ }
323
+ statusListEntry = await driver.getStatusListEntryByCredentialId({
324
+ statusListId,
325
+ statusListCorrelationId,
326
+ entryCorrelationId,
327
+ credentialId: updateRequest.credentialId,
328
+ errorOnNotFound: true
329
+ });
330
+ } else {
331
+ statusListEntry = await driver.getStatusListEntryByIndex({
332
+ ...statusListResult.id && {
333
+ statusListId: statusListResult.id
334
+ },
335
+ ...statusListResult.correlationId && {
336
+ statusListCorrelationId: statusListResult.correlationId
337
+ },
338
+ ...entryCorrelationId ? {
339
+ entryCorrelationId
340
+ } : {
341
+ statusListIndex: updateRequest.statusListIndex
342
+ },
343
+ errorOnNotFound: true
344
+ });
345
+ }
346
+ if (!statusListEntry) {
347
+ const identifier = "credentialId" in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`;
348
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`);
349
+ }
350
+ let statusListCredential = statusListResult.statusListCredential;
351
+ for (const updateItem of updateRequest.credentialStatus) {
352
+ if (!updateItem.status) {
353
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Required 'status' value was missing in the credentialStatus array`);
354
+ }
355
+ let value = "1";
356
+ if (updateItem.status === "0" || updateItem.status.toLowerCase() === "false") {
357
+ value = "0";
358
+ } else if (updateItem.status !== "1" && updateItem.status.toLowerCase() !== "true") {
359
+ if (updateItem.type === import_ssi_types.StatusListType.StatusList2021) {
360
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`);
361
+ } else if (parseInt(updateItem.status) < 0 || parseInt(updateItem.status) > 255) {
362
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, `Invalid 'status' value in the credentialStatus array: ${updateItem.status}`);
363
+ }
364
+ value = `${parseInt(updateItem.status)}`;
365
+ }
366
+ const updStatusListId = statusListId ?? statusListEntry.statusList?.id;
367
+ if (!updStatusListId) {
368
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 400, "statuslist id could not be determined");
369
+ }
370
+ await driver.updateStatusListEntry({
371
+ ...statusListEntry,
372
+ statusListId: updStatusListId,
373
+ value
374
+ });
375
+ statusListResult = await (0, import_ssi_sdk.updateStatusIndexFromStatusListCredential)({
376
+ statusListCredential,
377
+ statusListIndex: statusListEntry.statusListIndex,
378
+ value: parseInt(value),
379
+ keyRef: opts.keyRef
380
+ }, context);
381
+ statusListResult = await driver.updateStatusList({
382
+ statusListCredential: statusListResult.statusListCredential
383
+ });
384
+ }
385
+ return sendStatuslistResponse(statusListResult, statusListResult.statusListCredential, response);
386
+ } catch (e) {
387
+ return (0, import_ssi_express_support.sendErrorResponse)(response, 500, e.message, e);
388
+ }
389
+ });
390
+ }
391
+ __name(updateStatusEndpoint, "updateStatusEndpoint");
392
+
393
+ // src/statuslist-management-api-server.ts
394
+ var StatuslistManagementApiServer = class {
395
+ static {
396
+ __name(this, "StatuslistManagementApiServer");
397
+ }
398
+ get router() {
399
+ return this._router;
400
+ }
401
+ _express;
402
+ _agent;
403
+ _opts;
404
+ _router;
405
+ constructor(args) {
406
+ const { agent, opts } = args;
407
+ this._agent = agent;
408
+ if (opts?.endpointOpts?.globalAuth) {
409
+ (0, import_ssi_express_support2.copyGlobalAuthToEndpoint)({
410
+ opts,
411
+ key: "vcApiCredentialStatus"
412
+ });
413
+ (0, import_ssi_express_support2.copyGlobalAuthToEndpoint)({
414
+ opts,
415
+ key: "createStatusList"
416
+ });
417
+ (0, import_ssi_express_support2.copyGlobalAuthToEndpoint)({
418
+ opts,
419
+ key: "getStatusList"
420
+ });
421
+ }
422
+ this._opts = opts;
423
+ this._express = args.expressSupport.express;
424
+ this._router = import_express.default.Router();
425
+ const context = (0, import_ssi_sdk3.agentContext)(agent);
426
+ const features = opts?.enableFeatures ?? [
427
+ "status-list-management",
428
+ "status-list-hosting",
429
+ "w3c-vc-api-credential-status"
430
+ ];
431
+ console.log(`Status List API enabled, with features: ${JSON.stringify(features)}`);
432
+ if (features.includes("status-list-management")) {
433
+ createNewStatusListEndpoint(this.router, context, opts.endpointOpts.createStatusList);
434
+ }
435
+ if (features.includes("status-list-hosting")) {
436
+ getStatusListCredentialEndpoint(this.router, context, opts.endpointOpts.getStatusList);
437
+ getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList);
438
+ getStatusListCredentialIndexStatusEndpointLegacy(this.router, context, opts.endpointOpts.getStatusList);
439
+ }
440
+ if (features.includes("w3c-vc-api-credential-status")) {
441
+ updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus);
442
+ }
443
+ this._express.use(opts?.endpointOpts?.basePath ?? "", this.router);
444
+ }
445
+ get agent() {
446
+ return this._agent;
447
+ }
448
+ get opts() {
449
+ return this._opts;
450
+ }
451
+ get express() {
452
+ return this._express;
453
+ }
454
+ };
455
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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\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 = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type\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 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":["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","getStatusListCredentialIndexStatusEndpoint","statusListIdType","StatusListIdType","StatusListId","entryIdType","EntryIdType","StatusListIndex","statusListIndex","entityCorrelationId","statusListId","statusListCorrelationId","Number","parseInt","params","entryId","error","length","entry","getStatusListEntryByIndex","errorOnNotFound","type","StatusListType","StatusList2021","resultStatusIndex","checkStatusIndexFromStatusListCredential","statusPurpose","statusList2021","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"]}
@@ -0,0 +1,76 @@
1
+ import { GenericAuthArgs, ISingleEndpointOpts, ExpressSupport } from '@sphereon/ssi-express-support';
2
+ import { IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list';
3
+ import { IAgentContext, TAgent } from '@veramo/core';
4
+ import express, { Express, Router } from 'express';
5
+ import { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers';
6
+ import { StatusListType } from '@sphereon/ssi-types';
7
+
8
+ type IRequiredContext = IAgentContext<IRequiredPlugins & IStatusListPlugin>;
9
+ interface IStatusListOpts {
10
+ endpointOpts: IStatusListEndpointOpts;
11
+ enableFeatures?: statusListFeatures[];
12
+ }
13
+ interface IStatusListEndpointOpts {
14
+ basePath?: string;
15
+ globalAuth?: GenericAuthArgs;
16
+ vcApiCredentialStatus: IW3CredentialStatusEndpointOpts;
17
+ createStatusList: ICredentialStatusListEndpointOpts;
18
+ getStatusList: ICredentialStatusListEndpointOpts;
19
+ }
20
+ type statusListFeatures = 'w3c-vc-api-credential-status' | 'status-list-management' | 'status-list-hosting';
21
+ interface ICredentialStatusListEndpointOpts extends ISingleEndpointOpts {
22
+ dbName: string;
23
+ }
24
+ interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEndpointOpts {
25
+ statusListId?: string;
26
+ correlationId?: string;
27
+ keyRef?: string;
28
+ }
29
+ interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {
30
+ credentialId: string;
31
+ }
32
+ interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {
33
+ statusListIndex?: number;
34
+ }
35
+ interface UpdateCredentialStatusRequest {
36
+ credentialStatus: UpdateCredentialStatusItem[];
37
+ statusListId?: string;
38
+ statusListCorrelationId?: string;
39
+ entryCorrelationId?: string;
40
+ }
41
+ interface UpdateCredentialStatusItem {
42
+ type?: StatusListType;
43
+ status: string;
44
+ }
45
+ declare enum StatusListIdType {
46
+ StatusListId = "StatusListId",
47
+ StatusListCorrelationId = "StatusListCorrelationId"
48
+ }
49
+ declare enum EntryIdType {
50
+ StatusListIndex = "StatusListIndex",
51
+ EntryCorrelationId = "StatusListCorrelationId"
52
+ }
53
+
54
+ declare class StatuslistManagementApiServer {
55
+ get router(): express.Router;
56
+ private readonly _express;
57
+ private readonly _agent;
58
+ private readonly _opts?;
59
+ private readonly _router;
60
+ constructor(args: {
61
+ agent: TAgent<IRequiredPlugins & IStatusListPlugin>;
62
+ expressSupport: ExpressSupport;
63
+ opts: IStatusListOpts;
64
+ });
65
+ get agent(): TAgent<IRequiredPlugins>;
66
+ get opts(): IStatusListOpts | undefined;
67
+ get express(): Express;
68
+ }
69
+
70
+ declare function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
71
+ declare function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
72
+ declare function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
73
+ declare function getStatusListCredentialIndexStatusEndpointLegacy(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
74
+ declare function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts): void;
75
+
76
+ export { EntryIdType, type ICredentialStatusListEndpointOpts, type IRequiredContext, type IStatusListEndpointOpts, type IStatusListOpts, type IW3CredentialStatusEndpointOpts, StatusListIdType, StatuslistManagementApiServer, type UpdateCredentialStatusItem, type UpdateIndexedCredentialStatusRequest, type UpdateW3cCredentialStatusRequest, createNewStatusListEndpoint, getStatusListCredentialEndpoint, getStatusListCredentialIndexStatusEndpoint, getStatusListCredentialIndexStatusEndpointLegacy, type statusListFeatures, updateStatusEndpoint };