@sphereon/ssi-sdk.vc-status-list-issuer-drivers 0.34.1-next.3 → 0.34.1-next.322
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 +156 -70
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +171 -47
- package/dist/index.d.ts +171 -47
- package/dist/index.js +158 -72
- package/dist/index.js.map +1 -1
- package/package.json +12 -10
- package/src/drivers.ts +226 -84
- package/src/status-list-adapters.ts +22 -7
- package/src/types.ts +36 -18
package/dist/index.cjs
CHANGED
|
@@ -41,7 +41,6 @@ function statusListResultToEntity(result) {
|
|
|
41
41
|
id: result.id,
|
|
42
42
|
correlationId: result.correlationId,
|
|
43
43
|
driverType: result.driverType,
|
|
44
|
-
credentialIdMode: result.credentialIdMode,
|
|
45
44
|
length: result.length,
|
|
46
45
|
issuer: result.issuer,
|
|
47
46
|
type: result.type,
|
|
@@ -52,27 +51,42 @@ function statusListResultToEntity(result) {
|
|
|
52
51
|
if (!result.statusList2021) {
|
|
53
52
|
throw new Error("Missing statusList2021 details");
|
|
54
53
|
}
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
const entity = new import_ssi_sdk.StatusList2021Entity();
|
|
55
|
+
Object.assign(entity, baseFields, {
|
|
57
56
|
indexingDirection: result.statusList2021.indexingDirection,
|
|
58
|
-
statusPurpose: result.statusList2021.statusPurpose
|
|
57
|
+
statusPurpose: result.statusList2021.statusPurpose,
|
|
58
|
+
credentialIdMode: result.statusList2021.credentialIdMode
|
|
59
59
|
});
|
|
60
|
+
return entity;
|
|
60
61
|
} else if (result.type === import_ssi_types.StatusListType.OAuthStatusList) {
|
|
61
62
|
if (!result.oauthStatusList) {
|
|
62
63
|
throw new Error("Missing oauthStatusList details");
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
const entity = new import_ssi_sdk.OAuthStatusListEntity();
|
|
66
|
+
Object.assign(entity, baseFields, {
|
|
66
67
|
bitsPerStatus: result.oauthStatusList.bitsPerStatus,
|
|
67
68
|
expiresAt: result.oauthStatusList.expiresAt
|
|
68
69
|
});
|
|
70
|
+
return entity;
|
|
71
|
+
} else if (result.type === import_ssi_types.StatusListType.BitstringStatusList) {
|
|
72
|
+
if (!result.bitstringStatusList) {
|
|
73
|
+
throw new Error("Missing bitstringStatusList details");
|
|
74
|
+
}
|
|
75
|
+
const entity = new import_ssi_sdk.BitstringStatusListEntity();
|
|
76
|
+
Object.assign(entity, baseFields, {
|
|
77
|
+
statusPurpose: result.bitstringStatusList.statusPurpose,
|
|
78
|
+
ttl: result.bitstringStatusList.ttl,
|
|
79
|
+
bitsPerStatus: result.bitstringStatusList.bitsPerStatus,
|
|
80
|
+
validFrom: result.bitstringStatusList.validFrom,
|
|
81
|
+
validUntil: result.bitstringStatusList.validUntil
|
|
82
|
+
});
|
|
83
|
+
return entity;
|
|
69
84
|
}
|
|
70
85
|
throw new Error(`Unsupported status list type: ${result.type}`);
|
|
71
86
|
}
|
|
72
87
|
__name(statusListResultToEntity, "statusListResultToEntity");
|
|
73
88
|
|
|
74
89
|
// src/drivers.ts
|
|
75
|
-
var import_ssi_sdk5 = require("@sphereon/ssi-sdk.data-store");
|
|
76
90
|
function getOptions(args) {
|
|
77
91
|
return {
|
|
78
92
|
id: args.id,
|
|
@@ -107,11 +121,23 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
107
121
|
_statusListStore;
|
|
108
122
|
options;
|
|
109
123
|
_statusListLength;
|
|
124
|
+
/**
|
|
125
|
+
* Creates a new AgentDataSourceStatusListDriver instance
|
|
126
|
+
* @param _dataSource - TypeORM DataSource for database operations
|
|
127
|
+
* @param _statusListStore - StatusListStore for data persistence
|
|
128
|
+
* @param options - Driver configuration options
|
|
129
|
+
*/
|
|
110
130
|
constructor(_dataSource, _statusListStore, options) {
|
|
111
131
|
this._dataSource = _dataSource;
|
|
112
132
|
this._statusListStore = _statusListStore;
|
|
113
133
|
this.options = options;
|
|
114
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Initializes and creates a new AgentDataSourceStatusListDriver instance
|
|
137
|
+
* @param options - Status list management configuration
|
|
138
|
+
* @param dbArgs - Database connection arguments
|
|
139
|
+
* @returns Promise resolving to initialized driver instance
|
|
140
|
+
*/
|
|
115
141
|
static async init(options, dbArgs) {
|
|
116
142
|
if (options.driverType !== import_ssi_types2.StatusListDriverType.AGENT_TYPEORM) {
|
|
117
143
|
throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`);
|
|
@@ -134,76 +160,105 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
134
160
|
statusListStore = new import_ssi_sdk3.StatusListStore(dataSource);
|
|
135
161
|
return new _AgentDataSourceStatusListDriver(dataSource, statusListStore, options);
|
|
136
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Gets the TypeORM DataSource instance
|
|
165
|
+
* @returns DataSource instance for database operations
|
|
166
|
+
*/
|
|
137
167
|
get dataSource() {
|
|
138
168
|
if (!this._dataSource) {
|
|
139
169
|
throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`);
|
|
140
170
|
}
|
|
141
171
|
return this._dataSource;
|
|
142
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Gets the StatusListStore instance
|
|
175
|
+
* @returns StatusListStore for data persistence operations
|
|
176
|
+
*/
|
|
143
177
|
get statusListStore() {
|
|
144
178
|
if (!this._statusListStore) {
|
|
145
179
|
this._statusListStore = new import_ssi_sdk3.StatusListStore(this.dataSource);
|
|
146
180
|
}
|
|
147
181
|
return this._statusListStore;
|
|
148
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Gets the driver configuration options
|
|
185
|
+
* @returns DriverOptions configuration
|
|
186
|
+
*/
|
|
149
187
|
getOptions() {
|
|
150
188
|
return this.options.driverOptions ?? {};
|
|
151
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Gets the driver type
|
|
192
|
+
* @returns StatusListDriverType enum value
|
|
193
|
+
*/
|
|
152
194
|
getType() {
|
|
153
195
|
return this.options.driverType;
|
|
154
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Creates a new status list credential and stores it in the database
|
|
199
|
+
* @param args - Status list creation parameters
|
|
200
|
+
* @returns Promise resolving to StatusListResult
|
|
201
|
+
*/
|
|
155
202
|
async createStatusList(args) {
|
|
156
203
|
const correlationId = args.correlationId ?? this.options.correlationId;
|
|
157
204
|
if (!correlationId) {
|
|
158
205
|
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");
|
|
159
206
|
}
|
|
160
207
|
const credentialIdMode = args.credentialIdMode ?? import_ssi_types2.StatusListCredentialIdMode.ISSUANCE;
|
|
161
|
-
const
|
|
162
|
-
|
|
208
|
+
const implementationResult = await (0, import_ssi_sdk4.toStatusListDetails)({
|
|
209
|
+
statusListCredential: args.statusListCredential,
|
|
210
|
+
statusListType: args.statusListType,
|
|
211
|
+
bitsPerStatus: args.bitsPerStatus,
|
|
163
212
|
correlationId,
|
|
164
213
|
driverType: this.getType()
|
|
165
214
|
});
|
|
166
|
-
|
|
167
|
-
...
|
|
215
|
+
const statusListArgs = {
|
|
216
|
+
...implementationResult,
|
|
168
217
|
credentialIdMode,
|
|
169
218
|
correlationId,
|
|
170
219
|
driverType: this.getType()
|
|
171
|
-
}
|
|
172
|
-
this.
|
|
173
|
-
|
|
220
|
+
};
|
|
221
|
+
await this.statusListStore.addStatusList(statusListArgs);
|
|
222
|
+
this._statusListLength = implementationResult.length;
|
|
223
|
+
return implementationResult;
|
|
174
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Updates an existing status list credential in the database
|
|
227
|
+
* @param args - Status list update parameters
|
|
228
|
+
* @returns Promise resolving to StatusListResult
|
|
229
|
+
*/
|
|
175
230
|
async updateStatusList(args) {
|
|
176
231
|
const correlationId = args.correlationId ?? this.options.correlationId;
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
});
|
|
182
|
-
const entity = await (await this.statusListStore.getStatusListRepo(args.type)).findOne({
|
|
183
|
-
where: [
|
|
184
|
-
{
|
|
185
|
-
id: details.id
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
correlationId
|
|
189
|
-
}
|
|
190
|
-
]
|
|
232
|
+
const extractedDetails = await (0, import_ssi_sdk4.extractCredentialDetails)(args.statusListCredential);
|
|
233
|
+
const entity = await this.statusListStore.getStatusList({
|
|
234
|
+
id: extractedDetails.id,
|
|
235
|
+
correlationId
|
|
191
236
|
});
|
|
192
237
|
if (!entity) {
|
|
193
|
-
throw Error(`Status list ${
|
|
238
|
+
throw Error(`Status list ${extractedDetails.id}, correlationId ${correlationId} could not be found`);
|
|
194
239
|
}
|
|
195
|
-
|
|
240
|
+
entity.statusListCredential = args.statusListCredential;
|
|
241
|
+
const details = await (0, import_ssi_sdk4.toStatusListDetails)({
|
|
242
|
+
extractedDetails,
|
|
243
|
+
statusListEntity: entity
|
|
244
|
+
});
|
|
245
|
+
const updateArgs = {
|
|
196
246
|
...entity,
|
|
197
247
|
...details,
|
|
198
248
|
correlationId,
|
|
199
249
|
driverType: this.getType()
|
|
200
|
-
}
|
|
250
|
+
};
|
|
251
|
+
await this.statusListStore.updateStatusList(updateArgs);
|
|
201
252
|
this._statusListLength = details.length;
|
|
202
253
|
return {
|
|
203
254
|
...entity,
|
|
204
255
|
...details
|
|
205
256
|
};
|
|
206
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Deletes the status list from the database
|
|
260
|
+
* @returns Promise resolving to boolean indicating success
|
|
261
|
+
*/
|
|
207
262
|
async deleteStatusList() {
|
|
208
263
|
await this.statusListStore.removeStatusList({
|
|
209
264
|
id: this.options.id,
|
|
@@ -211,50 +266,48 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
211
266
|
});
|
|
212
267
|
return Promise.resolve(true);
|
|
213
268
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
269
|
+
/**
|
|
270
|
+
* Updates a status list entry and returns the credential status
|
|
271
|
+
* @param args - Status list entry update parameters
|
|
272
|
+
* @returns Promise resolving to credential status and entry
|
|
273
|
+
*/
|
|
220
274
|
async updateStatusListEntry(args) {
|
|
221
|
-
const
|
|
275
|
+
const statusListEntity = statusListResultToEntity(await this.getStatusList());
|
|
222
276
|
const statusListEntry = await this.statusListStore.updateStatusListEntry({
|
|
223
277
|
...args,
|
|
224
|
-
statusListId:
|
|
278
|
+
statusListId: statusListEntity.id
|
|
225
279
|
});
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
statusListEntry
|
|
236
|
-
};
|
|
237
|
-
} else if (this.isOAuthStatusListEntity(statusList)) {
|
|
238
|
-
return {
|
|
239
|
-
credentialStatus: {
|
|
240
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
241
|
-
type: "OAuthStatusListEntry",
|
|
242
|
-
bitsPerStatus: statusList.bitsPerStatus,
|
|
243
|
-
statusListIndex: "" + statusListEntry.statusListIndex,
|
|
244
|
-
statusListCredential: statusList.id,
|
|
245
|
-
expiresAt: statusList.expiresAt
|
|
246
|
-
},
|
|
247
|
-
statusListEntry
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
throw new Error(`Unsupported status list type: ${typeof statusList}`);
|
|
280
|
+
const credentialStatus = await (0, import_ssi_sdk4.createCredentialStatusFromStatusList)({
|
|
281
|
+
statusList: statusListEntity,
|
|
282
|
+
statusListEntry,
|
|
283
|
+
statusListIndex: statusListEntry.statusListIndex
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
credentialStatus,
|
|
287
|
+
statusListEntry
|
|
288
|
+
};
|
|
251
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Retrieves a status list entry by credential ID
|
|
292
|
+
* @param args - Query parameters including credential ID
|
|
293
|
+
* @returns Promise resolving to status list entry or undefined
|
|
294
|
+
*/
|
|
252
295
|
async getStatusListEntryByCredentialId(args) {
|
|
253
296
|
return await this.statusListStore.getStatusListEntryByCredentialId(args);
|
|
254
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Retrieves a status list entry by index
|
|
300
|
+
* @param args - Query parameters including status list index
|
|
301
|
+
* @returns Promise resolving to status list entry or undefined
|
|
302
|
+
*/
|
|
255
303
|
async getStatusListEntryByIndex(args) {
|
|
256
304
|
return await this.statusListStore.getStatusListEntryByIndex(args);
|
|
257
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* Generates a random available index for new status list entries
|
|
308
|
+
* @param args - Optional correlation ID parameter
|
|
309
|
+
* @returns Promise resolving to available index number
|
|
310
|
+
*/
|
|
258
311
|
async getRandomNewStatusListIndex(args) {
|
|
259
312
|
let result = -1;
|
|
260
313
|
let tries = 0;
|
|
@@ -263,6 +316,12 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
263
316
|
}
|
|
264
317
|
return result;
|
|
265
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Implementation for generating random status list indices with retry logic
|
|
321
|
+
* @param tries - Number of attempts made
|
|
322
|
+
* @param args - Optional correlation ID parameter
|
|
323
|
+
* @returns Promise resolving to available index or -1 if none found
|
|
324
|
+
*/
|
|
266
325
|
async getRandomNewStatusListIndexImpl(tries, args) {
|
|
267
326
|
const statusListId = this.options.id;
|
|
268
327
|
const correlationId = args?.correlationId ?? this.options.correlationId;
|
|
@@ -285,30 +344,57 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
285
344
|
}
|
|
286
345
|
return -1;
|
|
287
346
|
}
|
|
347
|
+
/**
|
|
348
|
+
* Gets the length of the status list
|
|
349
|
+
* @param args - Optional correlation ID parameter
|
|
350
|
+
* @returns Promise resolving to status list length
|
|
351
|
+
*/
|
|
288
352
|
async getStatusListLength(args) {
|
|
289
353
|
if (!this._statusListLength) {
|
|
290
354
|
this._statusListLength = await this.getStatusList(args).then((details) => details.length);
|
|
291
355
|
}
|
|
292
356
|
return this._statusListLength;
|
|
293
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Retrieves the status list details
|
|
360
|
+
* @param args - Optional correlation ID parameter
|
|
361
|
+
* @returns Promise resolving to StatusListResult
|
|
362
|
+
*/
|
|
294
363
|
async getStatusList(args) {
|
|
295
364
|
const id = this.options.id;
|
|
296
365
|
const correlationId = args?.correlationId ?? this.options.correlationId;
|
|
297
|
-
|
|
366
|
+
const statusListEntity = await this.statusListStore.getStatusList({
|
|
298
367
|
id,
|
|
299
368
|
correlationId
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
|
|
369
|
+
});
|
|
370
|
+
return await (0, import_ssi_sdk4.toStatusListDetails)({
|
|
371
|
+
statusListCredential: statusListEntity.statusListCredential,
|
|
372
|
+
statusListType: statusListEntity.type,
|
|
373
|
+
bitsPerStatus: statusListEntity.bitsPerStatus,
|
|
374
|
+
correlationId: statusListEntity.correlationId,
|
|
375
|
+
driverType: statusListEntity.driverType
|
|
376
|
+
});
|
|
303
377
|
}
|
|
378
|
+
/**
|
|
379
|
+
* Retrieves all status lists
|
|
380
|
+
* @returns Promise resolving to array of StatusListResult
|
|
381
|
+
*/
|
|
304
382
|
async getStatusLists() {
|
|
305
383
|
const statusLists = await this.statusListStore.getStatusLists({});
|
|
306
384
|
return Promise.all(statusLists.map(async (statusListEntity) => {
|
|
307
|
-
return (0, import_ssi_sdk4.
|
|
308
|
-
statusListCredential: statusListEntity.statusListCredential
|
|
385
|
+
return (0, import_ssi_sdk4.toStatusListDetails)({
|
|
386
|
+
statusListCredential: statusListEntity.statusListCredential,
|
|
387
|
+
statusListType: statusListEntity.type,
|
|
388
|
+
bitsPerStatus: statusListEntity.bitsPerStatus,
|
|
389
|
+
correlationId: statusListEntity.correlationId,
|
|
390
|
+
driverType: statusListEntity.driverType
|
|
309
391
|
});
|
|
310
392
|
}));
|
|
311
393
|
}
|
|
394
|
+
/**
|
|
395
|
+
* Checks if a status list index is currently in use
|
|
396
|
+
* @returns Promise resolving to boolean indicating usage status
|
|
397
|
+
*/
|
|
312
398
|
isStatusListIndexInUse() {
|
|
313
399
|
return Promise.resolve(false);
|
|
314
400
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\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 async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus\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 }\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\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity {\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 }\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","import_ssi_sdk","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","_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","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","/**\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 { StatusListCredentialIdMode, StatusListDriverType } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport {\n ICreateStatusListArgs,\n IGetRandomNewStatusListIndexArgs,\n IGetStatusListArgs,\n IGetStatusListLengthArgs,\n IStatusListDriver,\n IUpdateStatusListArgs,\n} 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: ICreateStatusListArgs): 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: IUpdateStatusListArgs): 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?: IGetRandomNewStatusListIndexArgs): 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?: IGetStatusListLengthArgs): 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?: IGetStatusListArgs): 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 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 const entity = new StatusList2021Entity()\n Object.assign(entity, baseFields, {\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n credentialIdMode: result.statusList2021.credentialIdMode,\n })\n return entity\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n const entity = new OAuthStatusListEntity()\n Object.assign(entity, baseFields, {\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n return entity\n } else if (result.type === StatusListType.BitstringStatusList) {\n if (!result.bitstringStatusList) {\n throw new Error('Missing bitstringStatusList details')\n }\n const entity = new BitstringStatusListEntity()\n Object.assign(entity, 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 return entity\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","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","entity","StatusList2021Entity","Object","assign","indexingDirection","statusPurpose","credentialIdMode","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","_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"]}
|