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

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
@@ -28,15 +28,14 @@ __export(index_exports, {
28
28
  module.exports = __toCommonJS(index_exports);
29
29
 
30
30
  // src/drivers.ts
31
- var import_ssi_sdk3 = require("@sphereon/ssi-sdk.agent-config");
32
- var import_ssi_sdk4 = require("@sphereon/ssi-sdk.data-store");
33
- var import_ssi_sdk5 = require("@sphereon/ssi-sdk.vc-status-list");
31
+ var import_ssi_sdk2 = require("@sphereon/ssi-sdk.agent-config");
32
+ var import_ssi_sdk3 = require("@sphereon/ssi-sdk.data-store");
33
+ var import_ssi_sdk4 = require("@sphereon/ssi-sdk.vc-status-list");
34
34
  var import_ssi_types2 = require("@sphereon/ssi-types");
35
35
 
36
36
  // src/status-list-adapters.ts
37
37
  var import_ssi_types = require("@sphereon/ssi-types");
38
38
  var import_ssi_sdk = require("@sphereon/ssi-sdk.data-store");
39
- var import_ssi_sdk2 = require("@sphereon/ssi-sdk.data-store");
40
39
  function statusListResultToEntity(result) {
41
40
  const baseFields = {
42
41
  id: result.id,
@@ -71,7 +70,7 @@ function statusListResultToEntity(result) {
71
70
  if (!result.bitstringStatusList) {
72
71
  throw new Error("Missing bitstringStatusList details");
73
72
  }
74
- return Object.assign(new import_ssi_sdk2.BitstringStatusListEntity(), {
73
+ return Object.assign(new import_ssi_sdk.BitstringStatusListEntity(), {
75
74
  ...baseFields,
76
75
  statusPurpose: result.bitstringStatusList.statusPurpose,
77
76
  ttl: result.bitstringStatusList.ttl,
@@ -84,7 +83,6 @@ function statusListResultToEntity(result) {
84
83
  __name(statusListResultToEntity, "statusListResultToEntity");
85
84
 
86
85
  // src/drivers.ts
87
- var import_ssi_sdk6 = require("@sphereon/ssi-sdk.data-store");
88
86
  function getOptions(args) {
89
87
  return {
90
88
  id: args.id,
@@ -101,7 +99,7 @@ async function getDriver(args) {
101
99
  if (!dbName) {
102
100
  throw Error(`Please provide either a DB name or data source`);
103
101
  }
104
- const dataSources = args.dataSources ?? import_ssi_sdk3.DataSources.singleInstance();
102
+ const dataSources = args.dataSources ?? import_ssi_sdk2.DataSources.singleInstance();
105
103
  return await AgentDataSourceStatusListDriver.init(getOptions({
106
104
  ...args,
107
105
  dbName
@@ -138,12 +136,12 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
138
136
  if (dbArgs?.dataSources) {
139
137
  dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName);
140
138
  } else {
141
- dataSource = await import_ssi_sdk3.DataSources.singleInstance().getDbConnection(options.driverOptions.dbName);
139
+ dataSource = await import_ssi_sdk2.DataSources.singleInstance().getDbConnection(options.driverOptions.dbName);
142
140
  }
143
141
  } else {
144
142
  return Promise.reject(Error(`Either a datasource or dbName needs to be provided`));
145
143
  }
146
- statusListStore = new import_ssi_sdk4.StatusListStore(dataSource);
144
+ statusListStore = new import_ssi_sdk3.StatusListStore(dataSource);
147
145
  return new _AgentDataSourceStatusListDriver(dataSource, statusListStore, options);
148
146
  }
149
147
  get dataSource() {
@@ -154,7 +152,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
154
152
  }
155
153
  get statusListStore() {
156
154
  if (!this._statusListStore) {
157
- this._statusListStore = new import_ssi_sdk4.StatusListStore(this.dataSource);
155
+ this._statusListStore = new import_ssi_sdk3.StatusListStore(this.dataSource);
158
156
  }
159
157
  return this._statusListStore;
160
158
  }
@@ -170,15 +168,19 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
170
168
  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");
171
169
  }
172
170
  const credentialIdMode = args.credentialIdMode ?? import_ssi_types2.StatusListCredentialIdMode.ISSUANCE;
173
- const details = await (0, import_ssi_sdk5.statusListCredentialToDetails)({
171
+ const details = await (0, import_ssi_sdk4.statusListCredentialToDetails)({
174
172
  ...args,
175
173
  correlationId,
176
- driverType: this.getType()
174
+ driverType: this.getType(),
175
+ bitsPerStatus: args.bitsPerStatus
177
176
  });
178
177
  await this.statusListStore.addStatusList({
179
178
  ...details,
180
179
  credentialIdMode,
181
180
  correlationId,
181
+ ...args.bitsPerStatus && {
182
+ bitsPerStatus: args.bitsPerStatus
183
+ },
182
184
  driverType: this.getType()
183
185
  });
184
186
  this._statusListLength = details.length;
@@ -186,7 +188,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
186
188
  }
187
189
  async updateStatusList(args) {
188
190
  const correlationId = args.correlationId ?? this.options.correlationId;
189
- const details = await (0, import_ssi_sdk5.statusListCredentialToDetails)({
191
+ const details = await (0, import_ssi_sdk4.statusListCredentialToDetails)({
190
192
  ...args,
191
193
  correlationId,
192
194
  driverType: this.getType()
@@ -224,13 +226,13 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
224
226
  return Promise.resolve(true);
225
227
  }
226
228
  isStatusList2021Entity(statusList) {
227
- return statusList instanceof import_ssi_sdk6.StatusList2021Entity;
229
+ return statusList instanceof import_ssi_sdk3.StatusList2021Entity;
228
230
  }
229
231
  isOAuthStatusListEntity(statusList) {
230
- return statusList instanceof import_ssi_sdk6.OAuthStatusListEntity;
232
+ return statusList instanceof import_ssi_sdk3.OAuthStatusListEntity;
231
233
  }
232
234
  isBitstringStatusListEntity(statusList) {
233
- return statusList instanceof import_ssi_sdk4.BitstringStatusListEntity;
235
+ return statusList instanceof import_ssi_sdk3.BitstringStatusListEntity;
234
236
  }
235
237
  async updateStatusListEntry(args) {
236
238
  const statusList = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList());
@@ -323,14 +325,15 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
323
325
  return await this.statusListStore.getStatusList({
324
326
  id,
325
327
  correlationId
326
- }).then((statusListEntity) => (0, import_ssi_sdk5.statusListCredentialToDetails)({
327
- statusListCredential: statusListEntity.statusListCredential
328
+ }).then((statusListEntity) => (0, import_ssi_sdk4.statusListCredentialToDetails)({
329
+ statusListCredential: statusListEntity.statusListCredential,
330
+ bitsPerStatus: statusListEntity.bitsPerStatus
328
331
  }));
329
332
  }
330
333
  async getStatusLists() {
331
334
  const statusLists = await this.statusListStore.getStatusLists({});
332
335
  return Promise.all(statusLists.map(async (statusListEntity) => {
333
- return (0, import_ssi_sdk5.statusListCredentialToDetails)({
336
+ return (0, import_ssi_sdk4.statusListCredentialToDetails)({
334
337
  statusListCredential: statusListEntity.statusListCredential
335
338
  });
336
339
  }));
@@ -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 BitstringStatusListEntity,\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\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 statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\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 const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: 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.type)\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 await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\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 private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n private isBitstringStatusListEntity(statusList: StatusListEntity): statusList is BitstringStatusListEntity {\n return statusList instanceof BitstringStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n } else if (this.isBitstringStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'BitstringStatusListEntry',\n statusPurpose: statusList.statusPurpose,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n } satisfies BitstringStatusListEntryCredentialStatus,\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | 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\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\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 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 { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nimport { BitstringStatusListEntity } from '@sphereon/ssi-sdk.data-store'\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 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","import_ssi_sdk","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","import_ssi_sdk","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","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","isBitstringStatusListEntity","BitstringStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","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","import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n BitstringStatusListEntity,\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n OAuthStatusListEntity,\n StatusList2021Entity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\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 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 const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType(), bitsPerStatus: args.bitsPerStatus })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n ...(args.bitsPerStatus && { bitsPerStatus: args.bitsPerStatus }),\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: 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.type)\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 await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\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 private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n private isBitstringStatusListEntity(statusList: StatusListEntity): statusList is BitstringStatusListEntity {\n return statusList instanceof BitstringStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n } else if (this.isBitstringStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'BitstringStatusListEntry',\n statusPurpose: statusList.statusPurpose,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n } satisfies BitstringStatusListEntryCredentialStatus,\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | 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 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 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 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","details","statusListCredentialToDetails","bitsPerStatus","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","isBitstringStatusListEntity","BitstringStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
package/dist/index.d.cts CHANGED
@@ -49,6 +49,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
49
49
  statusListCredential: StatusListCredential;
50
50
  correlationId?: string;
51
51
  credentialIdMode?: StatusListCredentialIdMode;
52
+ bitsPerStatus?: number;
52
53
  }): Promise<StatusListResult>;
53
54
  updateStatusList(args: {
54
55
  statusListCredential: StatusListCredential;
@@ -91,6 +92,7 @@ interface IStatusListDriver {
91
92
  createStatusList(args: {
92
93
  statusListCredential: StatusListCredential;
93
94
  correlationId?: string;
95
+ bitsPerStatus?: number;
94
96
  }): Promise<StatusListResult>;
95
97
  getStatusList(args?: {
96
98
  correlationId?: string;
package/dist/index.d.ts CHANGED
@@ -49,6 +49,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
49
49
  statusListCredential: StatusListCredential;
50
50
  correlationId?: string;
51
51
  credentialIdMode?: StatusListCredentialIdMode;
52
+ bitsPerStatus?: number;
52
53
  }): Promise<StatusListResult>;
53
54
  updateStatusList(args: {
54
55
  statusListCredential: StatusListCredential;
@@ -91,6 +92,7 @@ interface IStatusListDriver {
91
92
  createStatusList(args: {
92
93
  statusListCredential: StatusListCredential;
93
94
  correlationId?: string;
95
+ bitsPerStatus?: number;
94
96
  }): Promise<StatusListResult>;
95
97
  getStatusList(args?: {
96
98
  correlationId?: string;
package/dist/index.js CHANGED
@@ -3,14 +3,13 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
 
4
4
  // src/drivers.ts
5
5
  import { DataSources } from "@sphereon/ssi-sdk.agent-config";
6
- import { BitstringStatusListEntity as BitstringStatusListEntity2, StatusListStore } from "@sphereon/ssi-sdk.data-store";
6
+ import { BitstringStatusListEntity as BitstringStatusListEntity2, OAuthStatusListEntity as OAuthStatusListEntity2, StatusList2021Entity as StatusList2021Entity2, StatusListStore } from "@sphereon/ssi-sdk.data-store";
7
7
  import { statusListCredentialToDetails } from "@sphereon/ssi-sdk.vc-status-list";
8
8
  import { StatusListCredentialIdMode, StatusListDriverType } from "@sphereon/ssi-types";
9
9
 
10
10
  // src/status-list-adapters.ts
11
11
  import { StatusListType } from "@sphereon/ssi-types";
12
- import { OAuthStatusListEntity, StatusList2021Entity } from "@sphereon/ssi-sdk.data-store";
13
- import { BitstringStatusListEntity } from "@sphereon/ssi-sdk.data-store";
12
+ import { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from "@sphereon/ssi-sdk.data-store";
14
13
  function statusListResultToEntity(result) {
15
14
  const baseFields = {
16
15
  id: result.id,
@@ -58,7 +57,6 @@ function statusListResultToEntity(result) {
58
57
  __name(statusListResultToEntity, "statusListResultToEntity");
59
58
 
60
59
  // src/drivers.ts
61
- import { OAuthStatusListEntity as OAuthStatusListEntity2, StatusList2021Entity as StatusList2021Entity2 } from "@sphereon/ssi-sdk.data-store";
62
60
  function getOptions(args) {
63
61
  return {
64
62
  id: args.id,
@@ -147,12 +145,16 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
147
145
  const details = await statusListCredentialToDetails({
148
146
  ...args,
149
147
  correlationId,
150
- driverType: this.getType()
148
+ driverType: this.getType(),
149
+ bitsPerStatus: args.bitsPerStatus
151
150
  });
152
151
  await this.statusListStore.addStatusList({
153
152
  ...details,
154
153
  credentialIdMode,
155
154
  correlationId,
155
+ ...args.bitsPerStatus && {
156
+ bitsPerStatus: args.bitsPerStatus
157
+ },
156
158
  driverType: this.getType()
157
159
  });
158
160
  this._statusListLength = details.length;
@@ -298,7 +300,8 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
298
300
  id,
299
301
  correlationId
300
302
  }).then((statusListEntity) => statusListCredentialToDetails({
301
- statusListCredential: statusListEntity.statusListCredential
303
+ statusListCredential: statusListEntity.statusListCredential,
304
+ bitsPerStatus: statusListEntity.bitsPerStatus
302
305
  }));
303
306
  }
304
307
  async getStatusLists() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n BitstringStatusListEntity,\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\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 statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\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 const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: 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.type)\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 await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\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 private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n private isBitstringStatusListEntity(statusList: StatusListEntity): statusList is BitstringStatusListEntity {\n return statusList instanceof BitstringStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n } else if (this.isBitstringStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'BitstringStatusListEntry',\n statusPurpose: statusList.statusPurpose,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n } satisfies BitstringStatusListEntryCredentialStatus,\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | 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\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\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 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 { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nimport { BitstringStatusListEntity } from '@sphereon/ssi-sdk.data-store'\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 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":["DataSources","BitstringStatusListEntity","StatusListStore","statusListCredentialToDetails","StatusListCredentialIdMode","StatusListDriverType","StatusListType","OAuthStatusListEntity","StatusList2021Entity","BitstringStatusListEntity","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","OAuthStatusListEntity","StatusList2021Entity","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","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","isBitstringStatusListEntity","BitstringStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
1
+ {"version":3,"sources":["../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n BitstringStatusListEntity,\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n OAuthStatusListEntity,\n StatusList2021Entity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\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 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 const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType(), bitsPerStatus: args.bitsPerStatus })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n ...(args.bitsPerStatus && { bitsPerStatus: args.bitsPerStatus }),\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: 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.type)\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 await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\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 private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n private isBitstringStatusListEntity(statusList: StatusListEntity): statusList is BitstringStatusListEntity {\n return statusList instanceof BitstringStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n } else if (this.isBitstringStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'BitstringStatusListEntry',\n statusPurpose: statusList.statusPurpose,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n } satisfies BitstringStatusListEntryCredentialStatus,\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | 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 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 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 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":["DataSources","BitstringStatusListEntity","OAuthStatusListEntity","StatusList2021Entity","StatusListStore","statusListCredentialToDetails","StatusListCredentialIdMode","StatusListDriverType","StatusListType","BitstringStatusListEntity","OAuthStatusListEntity","StatusList2021Entity","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","details","statusListCredentialToDetails","bitsPerStatus","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","isBitstringStatusListEntity","BitstringStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.vc-status-list-issuer-drivers",
3
3
  "description": "Sphereon SSI-SDK plugin for Status List management, like StatusList2021. Issuer drivers module",
4
- "version": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
4
+ "version": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -22,14 +22,14 @@
22
22
  "build": "tsup --config ../../tsup.config.ts --tsconfig ../../tsconfig.tsup.json"
23
23
  },
24
24
  "dependencies": {
25
- "@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
25
+ "@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
26
26
  "@sphereon/ssi-sdk-ext.did-utils": "0.29.0",
27
27
  "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.0",
28
- "@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
29
- "@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
30
- "@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
31
- "@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
32
- "@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.2+0a0992f6",
28
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
29
+ "@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
30
+ "@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
31
+ "@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
32
+ "@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.8+82c2b7fe",
33
33
  "@sphereon/vc-status-list": "7.0.0-next.0",
34
34
  "@veramo/core": "4.2.0",
35
35
  "debug": "^4.3.5",
@@ -60,5 +60,5 @@
60
60
  "SSI",
61
61
  "StatusList2021"
62
62
  ],
63
- "gitHead": "0a0992f6323610a12e82716b1d80a2eedf4b4669"
63
+ "gitHead": "82c2b7fe8231dde7046c617a95ea5b76da98a1b8"
64
64
  }
package/src/drivers.ts CHANGED
@@ -6,6 +6,8 @@ import {
6
6
  IGetStatusListEntryByIndexArgs,
7
7
  IStatusListEntity,
8
8
  IStatusListEntryEntity,
9
+ OAuthStatusListEntity,
10
+ StatusList2021Entity,
9
11
  StatusListEntity,
10
12
  StatusListStore,
11
13
  } from '@sphereon/ssi-sdk.data-store'
@@ -16,11 +18,10 @@ import {
16
18
  StatusListOAuthEntryCredentialStatus,
17
19
  StatusListResult,
18
20
  } from '@sphereon/ssi-sdk.vc-status-list'
19
- import { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'
21
+ import { StatusListCredential, StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'
20
22
  import { DataSource } from 'typeorm'
21
23
  import { IStatusListDriver } from './types'
22
24
  import { statusListResultToEntity } from './status-list-adapters'
23
- import { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'
24
25
 
25
26
  export interface StatusListManagementOptions {
26
27
  id?: string
@@ -134,19 +135,21 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
134
135
  statusListCredential: StatusListCredential
135
136
  correlationId?: string
136
137
  credentialIdMode?: StatusListCredentialIdMode
138
+ bitsPerStatus?: number
137
139
  }): Promise<StatusListResult> {
138
140
  const correlationId = args.correlationId ?? this.options.correlationId
139
141
  if (!correlationId) {
140
142
  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')
141
143
  }
142
144
  const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE
143
- const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })
145
+ const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType(), bitsPerStatus: args.bitsPerStatus })
144
146
 
145
147
  // (StatusListStore does the duplicate entity check)
146
148
  await this.statusListStore.addStatusList({
147
149
  ...details,
148
150
  credentialIdMode,
149
151
  correlationId,
152
+ ...(args.bitsPerStatus && { bitsPerStatus: args.bitsPerStatus }),
150
153
  driverType: this.getType(),
151
154
  })
152
155
  this._statusListLength = details.length
@@ -296,9 +299,12 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
296
299
  async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {
297
300
  const id = this.options.id
298
301
  const correlationId = args?.correlationId ?? this.options.correlationId
299
- return await this.statusListStore
300
- .getStatusList({ id, correlationId })
301
- .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))
302
+ return await this.statusListStore.getStatusList({ id, correlationId }).then((statusListEntity: IStatusListEntity) =>
303
+ statusListCredentialToDetails({
304
+ statusListCredential: statusListEntity.statusListCredential!,
305
+ bitsPerStatus: statusListEntity.bitsPerStatus,
306
+ }),
307
+ )
302
308
  }
303
309
 
304
310
  async getStatusLists(): Promise<Array<StatusListResult>> {
@@ -1,9 +1,7 @@
1
1
  import { StatusListType } from '@sphereon/ssi-types'
2
- import { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'
2
+ import { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'
3
3
  import { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'
4
4
 
5
- import { BitstringStatusListEntity } from '@sphereon/ssi-sdk.data-store'
6
-
7
5
  export function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity | BitstringStatusListEntity {
8
6
  const baseFields = {
9
7
  id: result.id,
package/src/types.ts CHANGED
@@ -46,7 +46,7 @@ export interface IStatusListDriver {
46
46
 
47
47
  getStatusListLength(args?: { correlationId?: string }): Promise<number>
48
48
 
49
- createStatusList(args: { statusListCredential: StatusListCredential; correlationId?: string }): Promise<StatusListResult>
49
+ createStatusList(args: { statusListCredential: StatusListCredential; correlationId?: string; bitsPerStatus?: number }): Promise<StatusListResult>
50
50
 
51
51
  getStatusList(args?: { correlationId?: string }): Promise<StatusListResult>
52
52