@sphereon/ssi-sdk.vc-status-list-issuer-drivers 0.34.1-feature.SSISDK.17.bitstring.sl.13 → 0.34.1-feature.SSISDK.17.bitstring.sl.16

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
@@ -118,11 +118,23 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
118
118
  _statusListStore;
119
119
  options;
120
120
  _statusListLength;
121
+ /**
122
+ * Creates a new AgentDataSourceStatusListDriver instance
123
+ * @param _dataSource - TypeORM DataSource for database operations
124
+ * @param _statusListStore - StatusListStore for data persistence
125
+ * @param options - Driver configuration options
126
+ */
121
127
  constructor(_dataSource, _statusListStore, options) {
122
128
  this._dataSource = _dataSource;
123
129
  this._statusListStore = _statusListStore;
124
130
  this.options = options;
125
131
  }
132
+ /**
133
+ * Initializes and creates a new AgentDataSourceStatusListDriver instance
134
+ * @param options - Status list management configuration
135
+ * @param dbArgs - Database connection arguments
136
+ * @returns Promise resolving to initialized driver instance
137
+ */
126
138
  static async init(options, dbArgs) {
127
139
  if (options.driverType !== import_ssi_types2.StatusListDriverType.AGENT_TYPEORM) {
128
140
  throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`);
@@ -145,35 +157,57 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
145
157
  statusListStore = new import_ssi_sdk3.StatusListStore(dataSource);
146
158
  return new _AgentDataSourceStatusListDriver(dataSource, statusListStore, options);
147
159
  }
160
+ /**
161
+ * Gets the TypeORM DataSource instance
162
+ * @returns DataSource instance for database operations
163
+ */
148
164
  get dataSource() {
149
165
  if (!this._dataSource) {
150
166
  throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`);
151
167
  }
152
168
  return this._dataSource;
153
169
  }
170
+ /**
171
+ * Gets the StatusListStore instance
172
+ * @returns StatusListStore for data persistence operations
173
+ */
154
174
  get statusListStore() {
155
175
  if (!this._statusListStore) {
156
176
  this._statusListStore = new import_ssi_sdk3.StatusListStore(this.dataSource);
157
177
  }
158
178
  return this._statusListStore;
159
179
  }
180
+ /**
181
+ * Gets the driver configuration options
182
+ * @returns DriverOptions configuration
183
+ */
160
184
  getOptions() {
161
185
  return this.options.driverOptions ?? {};
162
186
  }
187
+ /**
188
+ * Gets the driver type
189
+ * @returns StatusListDriverType enum value
190
+ */
163
191
  getType() {
164
192
  return this.options.driverType;
165
193
  }
194
+ /**
195
+ * Creates a new status list credential and stores it in the database
196
+ * @param args - Status list creation parameters
197
+ * @returns Promise resolving to StatusListResult
198
+ */
166
199
  async createStatusList(args) {
167
200
  const correlationId = args.correlationId ?? this.options.correlationId;
168
201
  if (!correlationId) {
169
202
  throw Error("Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found");
170
203
  }
171
204
  const credentialIdMode = args.credentialIdMode ?? import_ssi_types2.StatusListCredentialIdMode.ISSUANCE;
172
- const implementationResult = await (0, import_ssi_sdk4.statusListCredentialToDetails)({
173
- ...args,
205
+ const implementationResult = await (0, import_ssi_sdk4.toStatusListDetails)({
206
+ statusListCredential: args.statusListCredential,
207
+ statusListType: args.statusListType,
208
+ bitsPerStatus: args.bitsPerStatus,
174
209
  correlationId,
175
- driverType: this.getType(),
176
- bitsPerStatus: args.bitsPerStatus
210
+ driverType: this.getType()
177
211
  });
178
212
  const statusListArgs = {
179
213
  ...implementationResult,
@@ -185,26 +219,26 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
185
219
  this._statusListLength = implementationResult.length;
186
220
  return implementationResult;
187
221
  }
222
+ /**
223
+ * Updates an existing status list credential in the database
224
+ * @param args - Status list update parameters
225
+ * @returns Promise resolving to StatusListResult
226
+ */
188
227
  async updateStatusList(args) {
189
228
  const correlationId = args.correlationId ?? this.options.correlationId;
190
- const details = await (0, import_ssi_sdk4.statusListCredentialToDetails)({
191
- ...args,
192
- correlationId,
193
- driverType: this.getType()
194
- });
195
- const entity = await (await this.statusListStore.getStatusListRepo(args.statusListType)).findOne({
196
- where: [
197
- {
198
- id: details.id
199
- },
200
- {
201
- correlationId
202
- }
203
- ]
229
+ const extractedDetails = await (0, import_ssi_sdk4.extractCredentialDetails)(args.statusListCredential);
230
+ const entity = await this.statusListStore.getStatusList({
231
+ id: extractedDetails.id,
232
+ correlationId
204
233
  });
205
234
  if (!entity) {
206
- throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`);
235
+ throw Error(`Status list ${extractedDetails.id}, correlationId ${correlationId} could not be found`);
207
236
  }
237
+ entity.statusListCredential = args.statusListCredential;
238
+ const details = await (0, import_ssi_sdk4.toStatusListDetails)({
239
+ extractedDetails,
240
+ statusListEntity: entity
241
+ });
208
242
  const updateArgs = {
209
243
  ...entity,
210
244
  ...details,
@@ -218,6 +252,10 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
218
252
  ...details
219
253
  };
220
254
  }
255
+ /**
256
+ * Deletes the status list from the database
257
+ * @returns Promise resolving to boolean indicating success
258
+ */
221
259
  async deleteStatusList() {
222
260
  await this.statusListStore.removeStatusList({
223
261
  id: this.options.id,
@@ -225,6 +263,11 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
225
263
  });
226
264
  return Promise.resolve(true);
227
265
  }
266
+ /**
267
+ * Updates a status list entry and returns the credential status
268
+ * @param args - Status list entry update parameters
269
+ * @returns Promise resolving to credential status and entry
270
+ */
228
271
  async updateStatusListEntry(args) {
229
272
  const statusListEntity = statusListResultToEntity(await this.getStatusList());
230
273
  const statusListEntry = await this.statusListStore.updateStatusListEntry({
@@ -241,12 +284,27 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
241
284
  statusListEntry
242
285
  };
243
286
  }
287
+ /**
288
+ * Retrieves a status list entry by credential ID
289
+ * @param args - Query parameters including credential ID
290
+ * @returns Promise resolving to status list entry or undefined
291
+ */
244
292
  async getStatusListEntryByCredentialId(args) {
245
293
  return await this.statusListStore.getStatusListEntryByCredentialId(args);
246
294
  }
295
+ /**
296
+ * Retrieves a status list entry by index
297
+ * @param args - Query parameters including status list index
298
+ * @returns Promise resolving to status list entry or undefined
299
+ */
247
300
  async getStatusListEntryByIndex(args) {
248
301
  return await this.statusListStore.getStatusListEntryByIndex(args);
249
302
  }
303
+ /**
304
+ * Generates a random available index for new status list entries
305
+ * @param args - Optional correlation ID parameter
306
+ * @returns Promise resolving to available index number
307
+ */
250
308
  async getRandomNewStatusListIndex(args) {
251
309
  let result = -1;
252
310
  let tries = 0;
@@ -255,6 +313,12 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
255
313
  }
256
314
  return result;
257
315
  }
316
+ /**
317
+ * Implementation for generating random status list indices with retry logic
318
+ * @param tries - Number of attempts made
319
+ * @param args - Optional correlation ID parameter
320
+ * @returns Promise resolving to available index or -1 if none found
321
+ */
258
322
  async getRandomNewStatusListIndexImpl(tries, args) {
259
323
  const statusListId = this.options.id;
260
324
  const correlationId = args?.correlationId ?? this.options.correlationId;
@@ -277,33 +341,57 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
277
341
  }
278
342
  return -1;
279
343
  }
344
+ /**
345
+ * Gets the length of the status list
346
+ * @param args - Optional correlation ID parameter
347
+ * @returns Promise resolving to status list length
348
+ */
280
349
  async getStatusListLength(args) {
281
350
  if (!this._statusListLength) {
282
351
  this._statusListLength = await this.getStatusList(args).then((details) => details.length);
283
352
  }
284
353
  return this._statusListLength;
285
354
  }
355
+ /**
356
+ * Retrieves the status list details
357
+ * @param args - Optional correlation ID parameter
358
+ * @returns Promise resolving to StatusListResult
359
+ */
286
360
  async getStatusList(args) {
287
361
  const id = this.options.id;
288
362
  const correlationId = args?.correlationId ?? this.options.correlationId;
289
- return await this.statusListStore.getStatusList({
363
+ const statusListEntity = await this.statusListStore.getStatusList({
290
364
  id,
291
365
  correlationId
292
- }).then((statusListEntity) => (0, import_ssi_sdk4.statusListCredentialToDetails)({
293
- statusListType: statusListEntity.type,
366
+ });
367
+ return await (0, import_ssi_sdk4.toStatusListDetails)({
294
368
  statusListCredential: statusListEntity.statusListCredential,
295
- bitsPerStatus: statusListEntity.bitsPerStatus
296
- }));
369
+ statusListType: statusListEntity.type,
370
+ bitsPerStatus: statusListEntity.bitsPerStatus,
371
+ correlationId: statusListEntity.correlationId,
372
+ driverType: statusListEntity.driverType
373
+ });
297
374
  }
375
+ /**
376
+ * Retrieves all status lists
377
+ * @returns Promise resolving to array of StatusListResult
378
+ */
298
379
  async getStatusLists() {
299
380
  const statusLists = await this.statusListStore.getStatusLists({});
300
381
  return Promise.all(statusLists.map(async (statusListEntity) => {
301
- return (0, import_ssi_sdk4.statusListCredentialToDetails)({
382
+ return (0, import_ssi_sdk4.toStatusListDetails)({
383
+ statusListCredential: statusListEntity.statusListCredential,
302
384
  statusListType: statusListEntity.type,
303
- statusListCredential: statusListEntity.statusListCredential
385
+ bitsPerStatus: statusListEntity.bitsPerStatus,
386
+ correlationId: statusListEntity.correlationId,
387
+ driverType: statusListEntity.driverType
304
388
  });
305
389
  }));
306
390
  }
391
+ /**
392
+ * Checks if a status list index is currently in use
393
+ * @returns Promise resolving to boolean indicating usage status
394
+ */
307
395
  isStatusListIndexInUse() {
308
396
  return Promise.resolve(false);
309
397
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './drivers'\n","import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListArgs,\n IAddStatusListEntryArgs,\n IBitstringStatusListEntryEntity,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\n createCredentialStatusFromStatusList,\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredential, StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListType: StatusListType\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n bitsPerStatus?: number\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n\n // Get implementation details\n const implementationResult = await statusListCredentialToDetails({\n ...args,\n correlationId,\n driverType: this.getType(),\n bitsPerStatus: args.bitsPerStatus,\n })\n\n // Add driver-specific fields to create complete entity\n const statusListArgs = {\n ...implementationResult,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.addStatusList(statusListArgs)\n this._statusListLength = implementationResult.length\n return implementationResult\n }\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n statusListType: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.statusListType)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n\n // Merge details with existing entity and driver properties\n const updateArgs = {\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.updateStatusList(updateArgs)\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity\n }> {\n // Get status list entity\n const statusListEntity: StatusListEntity = statusListResultToEntity(await this.getStatusList())\n\n // Update the entry in the store\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusListEntity.id })\n\n // Use implementation to create the credential status - this moves type-specific logic to implementations\n const credentialStatus = await createCredentialStatusFromStatusList({\n statusList: statusListEntity,\n statusListEntry,\n statusListIndex: statusListEntry.statusListIndex,\n })\n\n return {\n credentialStatus,\n statusListEntry,\n }\n }\n\n async getStatusListEntryByCredentialId(\n args: IGetStatusListEntryByCredentialIdArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(\n args: IGetStatusListEntryByIndexArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore.getStatusList({ id, correlationId }).then((statusListEntity: IStatusListEntity) =>\n statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n bitsPerStatus: statusListEntity.bitsPerStatus,\n }),\n )\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity | BitstringStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n } else if (result.type === StatusListType.BitstringStatusList) {\n if (!result.bitstringStatusList) {\n throw new Error('Missing bitstringStatusList details')\n }\n return Object.assign(new BitstringStatusListEntity(), {\n ...baseFields,\n statusPurpose: result.bitstringStatusList.statusPurpose,\n ttl: result.bitstringStatusList.ttl,\n bitsPerStatus: result.bitstringStatusList.bitsPerStatus,\n validFrom: result.bitstringStatusList.validFrom,\n validUntil: result.bitstringStatusList.validUntil,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_types","statusListResultToEntity","result","baseFields","id","correlationId","driverType","credentialIdMode","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","Object","assign","StatusList2021Entity","indexingDirection","statusPurpose","OAuthStatusList","oauthStatusList","OAuthStatusListEntity","bitsPerStatus","expiresAt","BitstringStatusList","bitstringStatusList","BitstringStatusListEntity","ttl","validFrom","validUntil","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","constructor","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","implementationResult","statusListCredentialToDetails","bitsPerStatus","statusListArgs","addStatusList","length","updateStatusList","details","entity","getStatusListRepo","statusListType","findOne","where","updateArgs","deleteStatusList","removeStatusList","resolve","updateStatusListEntry","statusListEntity","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","createCredentialStatusFromStatusList","statusList","statusListIndex","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","type","statusListCredential","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './drivers'\n","/**\n * StatusList Driver Implementation for TypeORM/Agent Data Sources\n *\n * This module provides the database-backed implementation of the IStatusListDriver interface,\n * handling persistence and retrieval of status list credentials and entries using TypeORM.\n * It delegates status list format-specific operations to the functions layer while managing\n * database interactions, driver configuration, and entity lifecycle.\n *\n * Key responsibilities:\n * - Database connection and store management\n * - Status list CRUD operations\n * - Status list entry management\n * - Random index generation for new entries\n * - Integration with multiple data sources\n *\n * @author Sphereon International B.V.\n * @since 2024\n */\n\nimport { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n BitstringStatusListEntryCredentialStatus,\n IAddStatusListArgs,\n IAddStatusListEntryArgs,\n IBitstringStatusListEntryEntity,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n createCredentialStatusFromStatusList,\n extractCredentialDetails,\n StatusList2021EntryCredentialStatus,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n toStatusListDetails,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredential, StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\n\n/**\n * Configuration options for status list management\n */\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\n/**\n * TypeORM-specific configuration options\n */\nexport interface TypeORMOptions {\n dbName?: string\n}\n\n/**\n * Filesystem-specific configuration options\n */\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\n/**\n * Creates status list management options for TypeORM driver\n * @param args - Configuration parameters including id, correlationId, and database name\n * @returns StatusListManagementOptions configured for TypeORM\n */\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\n/**\n * Creates and initializes a status list driver instance\n * @param args - Configuration parameters including database connection details\n * @returns Promise resolving to initialized IStatusListDriver instance\n */\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\n/**\n * TypeORM-based implementation of the IStatusListDriver interface\n *\n * Manages status list credentials and entries using a TypeORM data source.\n * Handles database operations while delegating format-specific logic to the functions layer.\n */\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n /**\n * Creates a new AgentDataSourceStatusListDriver instance\n * @param _dataSource - TypeORM DataSource for database operations\n * @param _statusListStore - StatusListStore for data persistence\n * @param options - Driver configuration options\n */\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n /**\n * Initializes and creates a new AgentDataSourceStatusListDriver instance\n * @param options - Status list management configuration\n * @param dbArgs - Database connection arguments\n * @returns Promise resolving to initialized driver instance\n */\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n /**\n * Gets the TypeORM DataSource instance\n * @returns DataSource instance for database operations\n */\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n /**\n * Gets the StatusListStore instance\n * @returns StatusListStore for data persistence operations\n */\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n /**\n * Gets the driver configuration options\n * @returns DriverOptions configuration\n */\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n /**\n * Gets the driver type\n * @returns StatusListDriverType enum value\n */\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n /**\n * Creates a new status list credential and stores it in the database\n * @param args - Status list creation parameters\n * @returns Promise resolving to StatusListResult\n */\n async createStatusList(args: {\n statusListType: StatusListType\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n bitsPerStatus?: number\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n\n // Convert credential to implementation details using CREATE/READ context\n const implementationResult = await toStatusListDetails({\n statusListCredential: args.statusListCredential,\n statusListType: args.statusListType,\n bitsPerStatus: args.bitsPerStatus,\n correlationId,\n driverType: this.getType(),\n })\n\n // Add driver-specific fields to create complete entity\n const statusListArgs = {\n ...implementationResult,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.addStatusList(statusListArgs)\n this._statusListLength = implementationResult.length\n return implementationResult\n }\n\n /**\n * Updates an existing status list credential in the database\n * @param args - Status list update parameters\n * @returns Promise resolving to StatusListResult\n */\n async updateStatusList(args: { statusListCredential: StatusListCredential; correlationId: string }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n\n const extractedDetails = await extractCredentialDetails(args.statusListCredential)\n const entity = await this.statusListStore.getStatusList({\n id: extractedDetails.id,\n correlationId,\n })\n if (!entity) {\n throw Error(`Status list ${extractedDetails.id}, correlationId ${correlationId} could not be found`)\n }\n\n entity.statusListCredential = args.statusListCredential\n\n const details = await toStatusListDetails({\n extractedDetails,\n statusListEntity: entity,\n })\n\n // Merge details with existing entity and driver properties\n const updateArgs = {\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.updateStatusList(updateArgs)\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n /**\n * Deletes the status list from the database\n * @returns Promise resolving to boolean indicating success\n */\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n /**\n * Updates a status list entry and returns the credential status\n * @param args - Status list entry update parameters\n * @returns Promise resolving to credential status and entry\n */\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity\n }> {\n // Get status list entity\n const statusListEntity: StatusListEntity = statusListResultToEntity(await this.getStatusList())\n\n // Update the entry in the store\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusListEntity.id })\n\n // Use implementation to create the credential status - this moves type-specific logic to implementations\n const credentialStatus = await createCredentialStatusFromStatusList({\n statusList: statusListEntity,\n statusListEntry,\n statusListIndex: statusListEntry.statusListIndex,\n })\n\n return {\n credentialStatus,\n statusListEntry,\n }\n }\n\n /**\n * Retrieves a status list entry by credential ID\n * @param args - Query parameters including credential ID\n * @returns Promise resolving to status list entry or undefined\n */\n async getStatusListEntryByCredentialId(\n args: IGetStatusListEntryByCredentialIdArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n /**\n * Retrieves a status list entry by index\n * @param args - Query parameters including status list index\n * @returns Promise resolving to status list entry or undefined\n */\n async getStatusListEntryByIndex(\n args: IGetStatusListEntryByIndexArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n /**\n * Generates a random available index for new status list entries\n * @param args - Optional correlation ID parameter\n * @returns Promise resolving to available index number\n */\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n /**\n * Implementation for generating random status list indices with retry logic\n * @param tries - Number of attempts made\n * @param args - Optional correlation ID parameter\n * @returns Promise resolving to available index or -1 if none found\n */\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n /**\n * Gets the length of the status list\n * @param args - Optional correlation ID parameter\n * @returns Promise resolving to status list length\n */\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n /**\n * Retrieves the status list details\n * @param args - Optional correlation ID parameter\n * @returns Promise resolving to StatusListResult\n */\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n\n const statusListEntity = await this.statusListStore.getStatusList({ id, correlationId })\n\n // Convert entity to result using CREATE/READ context\n return await toStatusListDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n statusListType: statusListEntity.type,\n bitsPerStatus: statusListEntity.bitsPerStatus,\n correlationId: statusListEntity.correlationId,\n driverType: statusListEntity.driverType,\n })\n }\n\n /**\n * Retrieves all status lists\n * @returns Promise resolving to array of StatusListResult\n */\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return toStatusListDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n statusListType: statusListEntity.type,\n bitsPerStatus: statusListEntity.bitsPerStatus,\n correlationId: statusListEntity.correlationId,\n driverType: statusListEntity.driverType,\n })\n }),\n )\n }\n\n /**\n * Checks if a status list index is currently in use\n * @returns Promise resolving to boolean indicating usage status\n */\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity | BitstringStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n } else if (result.type === StatusListType.BitstringStatusList) {\n if (!result.bitstringStatusList) {\n throw new Error('Missing bitstringStatusList details')\n }\n return Object.assign(new BitstringStatusListEntity(), {\n ...baseFields,\n statusPurpose: result.bitstringStatusList.statusPurpose,\n ttl: result.bitstringStatusList.ttl,\n bitsPerStatus: result.bitstringStatusList.bitsPerStatus,\n validFrom: result.bitstringStatusList.validFrom,\n validUntil: result.bitstringStatusList.validUntil,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_types","statusListResultToEntity","result","baseFields","id","correlationId","driverType","credentialIdMode","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","Object","assign","StatusList2021Entity","indexingDirection","statusPurpose","OAuthStatusList","oauthStatusList","OAuthStatusListEntity","bitsPerStatus","expiresAt","BitstringStatusList","bitstringStatusList","BitstringStatusListEntity","ttl","validFrom","validUntil","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","constructor","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","implementationResult","toStatusListDetails","statusListCredential","statusListType","bitsPerStatus","statusListArgs","addStatusList","length","updateStatusList","extractedDetails","extractCredentialDetails","entity","getStatusList","details","statusListEntity","updateArgs","deleteStatusList","removeStatusList","resolve","updateStatusListEntry","statusListResultToEntity","statusListEntry","statusListId","credentialStatus","createCredentialStatusFromStatusList","statusList","statusListIndex","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","type","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
package/dist/index.d.cts CHANGED
@@ -1,12 +1,34 @@
1
1
  import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution';
2
- import { StatusListStore, IAddStatusListEntryArgs, IStatusListEntryEntity, IBitstringStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
3
- import { StatusListResult, StatusList2021EntryCredentialStatus, StatusListOAuthEntryCredentialStatus, BitstringStatusListEntryCredentialStatus, IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list';
2
+ import { StatusListStore, IAddStatusListEntryArgs, BitstringStatusListEntryCredentialStatus, IStatusListEntryEntity, IBitstringStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
3
+ import { StatusListResult, StatusList2021EntryCredentialStatus, StatusListOAuthEntryCredentialStatus, IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list';
4
4
  import { StatusListDriverType, StatusListType, StatusListCredential, StatusListCredentialIdMode } from '@sphereon/ssi-types';
5
5
  import { IDataStoreORM, IDIDManager, IKeyManager, ICredentialIssuer, ICredentialVerifier, IResolver, IAgentContext } from '@veramo/core';
6
6
  import { DataSources } from '@sphereon/ssi-sdk.agent-config';
7
7
  import { DataSource } from 'typeorm';
8
8
  import { IVcdmCredentialPlugin } from '@sphereon/ssi-sdk.credential-vcdm';
9
9
 
10
+ /**
11
+ * StatusList Driver Implementation for TypeORM/Agent Data Sources
12
+ *
13
+ * This module provides the database-backed implementation of the IStatusListDriver interface,
14
+ * handling persistence and retrieval of status list credentials and entries using TypeORM.
15
+ * It delegates status list format-specific operations to the functions layer while managing
16
+ * database interactions, driver configuration, and entity lifecycle.
17
+ *
18
+ * Key responsibilities:
19
+ * - Database connection and store management
20
+ * - Status list CRUD operations
21
+ * - Status list entry management
22
+ * - Random index generation for new entries
23
+ * - Integration with multiple data sources
24
+ *
25
+ * @author Sphereon International B.V.
26
+ * @since 2024
27
+ */
28
+
29
+ /**
30
+ * Configuration options for status list management
31
+ */
10
32
  interface StatusListManagementOptions {
11
33
  id?: string;
12
34
  correlationId?: string;
@@ -14,17 +36,33 @@ interface StatusListManagementOptions {
14
36
  driverOptions?: DriverOptions;
15
37
  }
16
38
  type DriverOptions = TypeORMOptions;
39
+ /**
40
+ * TypeORM-specific configuration options
41
+ */
17
42
  interface TypeORMOptions {
18
43
  dbName?: string;
19
44
  }
45
+ /**
46
+ * Filesystem-specific configuration options
47
+ */
20
48
  interface FilesystemOptions {
21
49
  path: string;
22
50
  }
51
+ /**
52
+ * Creates status list management options for TypeORM driver
53
+ * @param args - Configuration parameters including id, correlationId, and database name
54
+ * @returns StatusListManagementOptions configured for TypeORM
55
+ */
23
56
  declare function getOptions(args: {
24
57
  id?: string;
25
58
  correlationId?: string;
26
59
  dbName: string;
27
60
  }): StatusListManagementOptions;
61
+ /**
62
+ * Creates and initializes a status list driver instance
63
+ * @param args - Configuration parameters including database connection details
64
+ * @returns Promise resolving to initialized IStatusListDriver instance
65
+ */
28
66
  declare function getDriver(args: {
29
67
  id?: string;
30
68
  correlationId?: string;
@@ -32,20 +70,59 @@ declare function getDriver(args: {
32
70
  dataSource?: DataSource;
33
71
  dataSources?: DataSources;
34
72
  }): Promise<IStatusListDriver>;
73
+ /**
74
+ * TypeORM-based implementation of the IStatusListDriver interface
75
+ *
76
+ * Manages status list credentials and entries using a TypeORM data source.
77
+ * Handles database operations while delegating format-specific logic to the functions layer.
78
+ */
35
79
  declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
36
80
  private _dataSource;
37
81
  private _statusListStore;
38
82
  private options;
39
83
  private _statusListLength;
84
+ /**
85
+ * Creates a new AgentDataSourceStatusListDriver instance
86
+ * @param _dataSource - TypeORM DataSource for database operations
87
+ * @param _statusListStore - StatusListStore for data persistence
88
+ * @param options - Driver configuration options
89
+ */
40
90
  constructor(_dataSource: DataSource, _statusListStore: StatusListStore, options: StatusListManagementOptions);
91
+ /**
92
+ * Initializes and creates a new AgentDataSourceStatusListDriver instance
93
+ * @param options - Status list management configuration
94
+ * @param dbArgs - Database connection arguments
95
+ * @returns Promise resolving to initialized driver instance
96
+ */
41
97
  static init(options: StatusListManagementOptions, dbArgs?: {
42
98
  dataSources?: DataSources;
43
99
  dataSource?: DataSource;
44
100
  }): Promise<AgentDataSourceStatusListDriver>;
101
+ /**
102
+ * Gets the TypeORM DataSource instance
103
+ * @returns DataSource instance for database operations
104
+ */
45
105
  get dataSource(): DataSource;
106
+ /**
107
+ * Gets the StatusListStore instance
108
+ * @returns StatusListStore for data persistence operations
109
+ */
46
110
  get statusListStore(): StatusListStore;
111
+ /**
112
+ * Gets the driver configuration options
113
+ * @returns DriverOptions configuration
114
+ */
47
115
  getOptions(): DriverOptions;
116
+ /**
117
+ * Gets the driver type
118
+ * @returns StatusListDriverType enum value
119
+ */
48
120
  getType(): StatusListDriverType;
121
+ /**
122
+ * Creates a new status list credential and stores it in the database
123
+ * @param args - Status list creation parameters
124
+ * @returns Promise resolving to StatusListResult
125
+ */
49
126
  createStatusList(args: {
50
127
  statusListType: StatusListType;
51
128
  statusListCredential: StatusListCredential;
@@ -53,29 +130,81 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
53
130
  credentialIdMode?: StatusListCredentialIdMode;
54
131
  bitsPerStatus?: number;
55
132
  }): Promise<StatusListResult>;
133
+ /**
134
+ * Updates an existing status list credential in the database
135
+ * @param args - Status list update parameters
136
+ * @returns Promise resolving to StatusListResult
137
+ */
56
138
  updateStatusList(args: {
57
139
  statusListCredential: StatusListCredential;
58
140
  correlationId: string;
59
- statusListType: StatusListType;
60
141
  }): Promise<StatusListResult>;
142
+ /**
143
+ * Deletes the status list from the database
144
+ * @returns Promise resolving to boolean indicating success
145
+ */
61
146
  deleteStatusList(): Promise<boolean>;
147
+ /**
148
+ * Updates a status list entry and returns the credential status
149
+ * @param args - Status list entry update parameters
150
+ * @returns Promise resolving to credential status and entry
151
+ */
62
152
  updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{
63
153
  credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus;
64
154
  statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity;
65
155
  }>;
156
+ /**
157
+ * Retrieves a status list entry by credential ID
158
+ * @param args - Query parameters including credential ID
159
+ * @returns Promise resolving to status list entry or undefined
160
+ */
66
161
  getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
162
+ /**
163
+ * Retrieves a status list entry by index
164
+ * @param args - Query parameters including status list index
165
+ * @returns Promise resolving to status list entry or undefined
166
+ */
67
167
  getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
168
+ /**
169
+ * Generates a random available index for new status list entries
170
+ * @param args - Optional correlation ID parameter
171
+ * @returns Promise resolving to available index number
172
+ */
68
173
  getRandomNewStatusListIndex(args?: {
69
174
  correlationId?: string;
70
175
  }): Promise<number>;
176
+ /**
177
+ * Implementation for generating random status list indices with retry logic
178
+ * @param tries - Number of attempts made
179
+ * @param args - Optional correlation ID parameter
180
+ * @returns Promise resolving to available index or -1 if none found
181
+ */
71
182
  private getRandomNewStatusListIndexImpl;
183
+ /**
184
+ * Gets the length of the status list
185
+ * @param args - Optional correlation ID parameter
186
+ * @returns Promise resolving to status list length
187
+ */
72
188
  getStatusListLength(args?: {
73
189
  correlationId?: string;
74
190
  }): Promise<number>;
191
+ /**
192
+ * Retrieves the status list details
193
+ * @param args - Optional correlation ID parameter
194
+ * @returns Promise resolving to StatusListResult
195
+ */
75
196
  getStatusList(args?: {
76
197
  correlationId?: string;
77
198
  }): Promise<StatusListResult>;
199
+ /**
200
+ * Retrieves all status lists
201
+ * @returns Promise resolving to array of StatusListResult
202
+ */
78
203
  getStatusLists(): Promise<Array<StatusListResult>>;
204
+ /**
205
+ * Checks if a status list index is currently in use
206
+ * @returns Promise resolving to boolean indicating usage status
207
+ */
79
208
  isStatusListIndexInUse(): Promise<boolean>;
80
209
  }
81
210
 
@@ -89,6 +218,7 @@ interface IStatusListDriver {
89
218
  correlationId?: string;
90
219
  }): Promise<number>;
91
220
  createStatusList(args: {
221
+ statusListType: StatusListType;
92
222
  statusListCredential: StatusListCredential;
93
223
  correlationId?: string;
94
224
  bitsPerStatus?: number;
@@ -105,6 +235,7 @@ interface IStatusListDriver {
105
235
  getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined>;
106
236
  updateStatusList(args: {
107
237
  statusListCredential: StatusListCredential;
238
+ correlationId: string;
108
239
  }): Promise<StatusListResult>;
109
240
  deleteStatusList(): Promise<boolean>;
110
241
  getRandomNewStatusListIndex(args?: {