@sphereon/ssi-sdk.vc-status-list-issuer-drivers 0.34.1-feature.SSISDK.17.bitstring.sl.10 → 0.34.1-feature.SSISDK.17.bitstring.sl.13
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 +25 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -11
- package/dist/index.d.ts +10 -11
- package/dist/index.js +27 -62
- package/dist/index.js.map +1 -1
- package/package.json +9 -8
- package/src/drivers.ts +53 -71
- package/src/status-list-adapters.ts +1 -0
- package/src/types.ts +3 -11
package/dist/index.cjs
CHANGED
|
@@ -74,6 +74,7 @@ function statusListResultToEntity(result) {
|
|
|
74
74
|
...baseFields,
|
|
75
75
|
statusPurpose: result.bitstringStatusList.statusPurpose,
|
|
76
76
|
ttl: result.bitstringStatusList.ttl,
|
|
77
|
+
bitsPerStatus: result.bitstringStatusList.bitsPerStatus,
|
|
77
78
|
validFrom: result.bitstringStatusList.validFrom,
|
|
78
79
|
validUntil: result.bitstringStatusList.validUntil
|
|
79
80
|
});
|
|
@@ -168,23 +169,21 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
168
169
|
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");
|
|
169
170
|
}
|
|
170
171
|
const credentialIdMode = args.credentialIdMode ?? import_ssi_types2.StatusListCredentialIdMode.ISSUANCE;
|
|
171
|
-
const
|
|
172
|
+
const implementationResult = await (0, import_ssi_sdk4.statusListCredentialToDetails)({
|
|
172
173
|
...args,
|
|
173
174
|
correlationId,
|
|
174
175
|
driverType: this.getType(),
|
|
175
176
|
bitsPerStatus: args.bitsPerStatus
|
|
176
177
|
});
|
|
177
|
-
|
|
178
|
-
...
|
|
178
|
+
const statusListArgs = {
|
|
179
|
+
...implementationResult,
|
|
179
180
|
credentialIdMode,
|
|
180
181
|
correlationId,
|
|
181
|
-
...args.bitsPerStatus && {
|
|
182
|
-
bitsPerStatus: args.bitsPerStatus
|
|
183
|
-
},
|
|
184
182
|
driverType: this.getType()
|
|
185
|
-
}
|
|
186
|
-
this.
|
|
187
|
-
|
|
183
|
+
};
|
|
184
|
+
await this.statusListStore.addStatusList(statusListArgs);
|
|
185
|
+
this._statusListLength = implementationResult.length;
|
|
186
|
+
return implementationResult;
|
|
188
187
|
}
|
|
189
188
|
async updateStatusList(args) {
|
|
190
189
|
const correlationId = args.correlationId ?? this.options.correlationId;
|
|
@@ -193,7 +192,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
193
192
|
correlationId,
|
|
194
193
|
driverType: this.getType()
|
|
195
194
|
});
|
|
196
|
-
const entity = await (await this.statusListStore.getStatusListRepo(args.
|
|
195
|
+
const entity = await (await this.statusListStore.getStatusListRepo(args.statusListType)).findOne({
|
|
197
196
|
where: [
|
|
198
197
|
{
|
|
199
198
|
id: details.id
|
|
@@ -206,12 +205,13 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
206
205
|
if (!entity) {
|
|
207
206
|
throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`);
|
|
208
207
|
}
|
|
209
|
-
|
|
208
|
+
const updateArgs = {
|
|
210
209
|
...entity,
|
|
211
210
|
...details,
|
|
212
211
|
correlationId,
|
|
213
212
|
driverType: this.getType()
|
|
214
|
-
}
|
|
213
|
+
};
|
|
214
|
+
await this.statusListStore.updateStatusList(updateArgs);
|
|
215
215
|
this._statusListLength = details.length;
|
|
216
216
|
return {
|
|
217
217
|
...entity,
|
|
@@ -225,58 +225,21 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
225
225
|
});
|
|
226
226
|
return Promise.resolve(true);
|
|
227
227
|
}
|
|
228
|
-
isStatusList2021Entity(statusList) {
|
|
229
|
-
return statusList instanceof import_ssi_sdk3.StatusList2021Entity;
|
|
230
|
-
}
|
|
231
|
-
isOAuthStatusListEntity(statusList) {
|
|
232
|
-
return statusList instanceof import_ssi_sdk3.OAuthStatusListEntity;
|
|
233
|
-
}
|
|
234
|
-
isBitstringStatusListEntity(statusList) {
|
|
235
|
-
return statusList instanceof import_ssi_sdk3.BitstringStatusListEntity;
|
|
236
|
-
}
|
|
237
228
|
async updateStatusListEntry(args) {
|
|
238
|
-
const
|
|
229
|
+
const statusListEntity = statusListResultToEntity(await this.getStatusList());
|
|
239
230
|
const statusListEntry = await this.statusListStore.updateStatusListEntry({
|
|
240
231
|
...args,
|
|
241
|
-
statusListId:
|
|
232
|
+
statusListId: statusListEntity.id
|
|
242
233
|
});
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
statusListEntry
|
|
253
|
-
};
|
|
254
|
-
} else if (this.isOAuthStatusListEntity(statusList)) {
|
|
255
|
-
return {
|
|
256
|
-
credentialStatus: {
|
|
257
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
258
|
-
type: "OAuthStatusListEntry",
|
|
259
|
-
bitsPerStatus: statusList.bitsPerStatus,
|
|
260
|
-
statusListIndex: "" + statusListEntry.statusListIndex,
|
|
261
|
-
statusListCredential: statusList.id,
|
|
262
|
-
expiresAt: statusList.expiresAt
|
|
263
|
-
},
|
|
264
|
-
statusListEntry
|
|
265
|
-
};
|
|
266
|
-
} else if (this.isBitstringStatusListEntity(statusList)) {
|
|
267
|
-
return {
|
|
268
|
-
credentialStatus: {
|
|
269
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
270
|
-
type: "BitstringStatusListEntry",
|
|
271
|
-
statusPurpose: statusList.statusPurpose,
|
|
272
|
-
statusListIndex: "" + statusListEntry.statusListIndex,
|
|
273
|
-
statusListCredential: statusList.id,
|
|
274
|
-
bitsPerStatus: statusList.bitsPerStatus
|
|
275
|
-
},
|
|
276
|
-
statusListEntry
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
throw new Error(`Unsupported status list type: ${typeof statusList}`);
|
|
234
|
+
const credentialStatus = await (0, import_ssi_sdk4.createCredentialStatusFromStatusList)({
|
|
235
|
+
statusList: statusListEntity,
|
|
236
|
+
statusListEntry,
|
|
237
|
+
statusListIndex: statusListEntry.statusListIndex
|
|
238
|
+
});
|
|
239
|
+
return {
|
|
240
|
+
credentialStatus,
|
|
241
|
+
statusListEntry
|
|
242
|
+
};
|
|
280
243
|
}
|
|
281
244
|
async getStatusListEntryByCredentialId(args) {
|
|
282
245
|
return await this.statusListStore.getStatusListEntryByCredentialId(args);
|
|
@@ -327,6 +290,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
327
290
|
id,
|
|
328
291
|
correlationId
|
|
329
292
|
}).then((statusListEntity) => (0, import_ssi_sdk4.statusListCredentialToDetails)({
|
|
293
|
+
statusListType: statusListEntity.type,
|
|
330
294
|
statusListCredential: statusListEntity.statusListCredential,
|
|
331
295
|
bitsPerStatus: statusListEntity.bitsPerStatus
|
|
332
296
|
}));
|
|
@@ -335,6 +299,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
335
299
|
const statusLists = await this.statusListStore.getStatusLists({});
|
|
336
300
|
return Promise.all(statusLists.map(async (statusListEntity) => {
|
|
337
301
|
return (0, import_ssi_sdk4.statusListCredentialToDetails)({
|
|
302
|
+
statusListType: statusListEntity.type,
|
|
338
303
|
statusListCredential: statusListEntity.statusListCredential
|
|
339
304
|
});
|
|
340
305
|
}));
|
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 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 bitsPerStatus: statusList.bitsPerStatus,\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":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;ACAA,IAAAA,kBAA4B;AAC5B,IAAAA,kBAWO;AACP,IAAAA,kBAMO;AACP,IAAAC,oBAAuG;;;ACpBvG,uBAA+B;AAC/B,qBAAuF;AAGhF,SAASC,yBAAyBC,QAAwB;AAC/D,QAAMC,aAAa;IACjBC,IAAIF,OAAOE;IACXC,eAAeH,OAAOG;IACtBC,YAAYJ,OAAOI;IACnBC,kBAAkBL,OAAOK;IACzBC,QAAQN,OAAOM;IACfC,QAAQP,OAAOO;IACfC,MAAMR,OAAOQ;IACbC,aAAaT,OAAOS;IACpBC,sBAAsBV,OAAOU;EAC/B;AAEA,MAAIV,OAAOQ,SAASG,gCAAeC,gBAAgB;AACjD,QAAI,CAACZ,OAAOa,gBAAgB;AAC1B,YAAM,IAAIC,MAAM,gCAAA;IAClB;AACA,WAAOC,OAAOC,OAAO,IAAIC,oCAAAA,GAAwB;MAC/C,GAAGhB;MACHiB,mBAAmBlB,OAAOa,eAAeK;MACzCC,eAAenB,OAAOa,eAAeM;IACvC,CAAA;EACF,WAAWnB,OAAOQ,SAASG,gCAAeS,iBAAiB;AACzD,QAAI,CAACpB,OAAOqB,iBAAiB;AAC3B,YAAM,IAAIP,MAAM,iCAAA;IAClB;AACA,WAAOC,OAAOC,OAAO,IAAIM,qCAAAA,GAAyB;MAChD,GAAGrB;MACHsB,eAAevB,OAAOqB,gBAAgBE;MACtCC,WAAWxB,OAAOqB,gBAAgBG;IACpC,CAAA;EACF,WAAWxB,OAAOQ,SAASG,gCAAec,qBAAqB;AAC7D,QAAI,CAACzB,OAAO0B,qBAAqB;AAC/B,YAAM,IAAIZ,MAAM,qCAAA;IAClB;AACA,WAAOC,OAAOC,OAAO,IAAIW,yCAAAA,GAA6B;MACpD,GAAG1B;MACHkB,eAAenB,OAAO0B,oBAAoBP;MAC1CS,KAAK5B,OAAO0B,oBAAoBE;MAChCC,WAAW7B,OAAO0B,oBAAoBG;MACtCC,YAAY9B,OAAO0B,oBAAoBI;IACzC,CAAA;EACF;AACA,QAAM,IAAIhB,MAAM,iCAAiCd,OAAOQ,IAAI,EAAE;AAChE;AA5CgBT;;;ADsCT,SAASgC,WAAWC,MAA6D;AACtF,SAAO;IACLC,IAAID,KAAKC;IACTC,eAAeF,KAAKE;IACpBC,YAAYC,uCAAqBC;IACjCC,eAAe;MAAEC,QAAQP,KAAKO;IAAO;EACvC;AACF;AAPgBR;AAShB,eAAsBS,UAAUR,MAM/B;AACC,QAAMO,SAASP,KAAKO,UAAUP,KAAKS,YAAYC;AAC/C,MAAI,CAACH,QAAQ;AACX,UAAMI,MAAM,gDAAgD;EAC9D;AACA,QAAMC,cAAcZ,KAAKY,eAAeC,4BAAYC,eAAc;AAClE,SAAO,MAAMC,gCAAgCC,KAC3CjB,WAAW;IACT,GAAGC;IACHO;EACF,CAAA,GACA;IAAEE,YAAYT,KAAKS,cAAe,MAAMG,YAAYK,gBAAgBV,MAAAA;IAAUK;EAAY,CAAA;AAE9F;AAnBsBJ;AAqBf,IAAMO,kCAAN,MAAMA,iCAAAA;EAxEb,OAwEaA;;;;;;EACHG;EAERC,YACUC,aACAC,kBACAC,SACR;SAHQF,cAAAA;SACAC,mBAAAA;SACAC,UAAAA;EACP;EAEH,aAAoBN,KAClBM,SACAC,QAI0C;AAC1C,QAAID,QAAQnB,eAAeC,uCAAqBC,eAAe;AAC7D,YAAMM,MAAM,uGAAuGW,QAAQnB,UAAU,EAAE;IACzI,WAAW,CAACmB,QAAQhB,eAAe;AACjC,YAAMK,MAAM,wEAAwE;IACtF;AACA,QAAIF;AACJ,QAAIe;AACJ,QAAID,QAAQd,YAAY;AACtBA,mBAAac,OAAOd;IACtB,WAAWa,QAAQhB,cAAcC,QAAQ;AACvC,UAAIgB,QAAQX,aAAa;AACvBH,qBAAa,MAAMc,OAAOX,YAAYK,gBAAgBK,QAAQhB,cAAcC,MAAM;MACpF,OAAO;AACLE,qBAAa,MAAMI,4BAAYC,eAAc,EAAGG,gBAAgBK,QAAQhB,cAAcC,MAAM;MAC9F;IACF,OAAO;AACL,aAAOkB,QAAQC,OAAOf,MAAM,oDAAoD,CAAA;IAClF;AAEAa,sBAAkB,IAAIG,gCAAgBlB,UAAAA;AACtC,WAAO,IAAIM,iCAAgCN,YAAYe,iBAAiBF,OAAAA;EAC1E;EAEA,IAAIb,aAAyB;AAC3B,QAAI,CAAC,KAAKW,aAAa;AACrB,YAAMT,MAAM,oCAAoC,KAAKW,QAAQhB,eAAeC,MAAAA,EAAQ;IACtF;AACA,WAAO,KAAKa;EACd;EAEA,IAAII,kBAAmC;AACrC,QAAI,CAAC,KAAKH,kBAAkB;AAC1B,WAAKA,mBAAmB,IAAIM,gCAAgB,KAAKlB,UAAU;IAC7D;AACA,WAAO,KAAKY;EACd;EAEAtB,aAA4B;AAC1B,WAAO,KAAKuB,QAAQhB,iBAAiB,CAAC;EACxC;EAEAsB,UAAgC;AAC9B,WAAO,KAAKN,QAAQnB;EACtB;EAEA,MAAM0B,iBAAiB7B,MAKO;AAC5B,UAAME,gBAAgBF,KAAKE,iBAAiB,KAAKoB,QAAQpB;AACzD,QAAI,CAACA,eAAe;AAClB,YAAMS,MAAM,yHAAA;IACd;AACA,UAAMmB,mBAAmB9B,KAAK8B,oBAAoBC,6CAA2BC;AAC7E,UAAMC,UAAU,UAAMC,+CAA8B;MAAE,GAAGlC;MAAME;MAAeC,YAAY,KAAKyB,QAAO;MAAIO,eAAenC,KAAKmC;IAAc,CAAA;AAG5I,UAAM,KAAKX,gBAAgBY,cAAc;MACvC,GAAGH;MACHH;MACA5B;MACA,GAAIF,KAAKmC,iBAAiB;QAAEA,eAAenC,KAAKmC;MAAc;MAC9DhC,YAAY,KAAKyB,QAAO;IAC1B,CAAA;AACA,SAAKV,oBAAoBe,QAAQI;AACjC,WAAOJ;EACT;EAEA,MAAMK,iBAAiBtC,MAIO;AAC5B,UAAME,gBAAgBF,KAAKE,iBAAiB,KAAKoB,QAAQpB;AACzD,UAAM+B,UAAU,UAAMC,+CAA8B;MAAE,GAAGlC;MAAME;MAAeC,YAAY,KAAKyB,QAAO;IAAG,CAAA;AACzG,UAAMW,SAAS,OACb,MAAM,KAAKf,gBAAgBgB,kBAAkBxC,KAAKyC,IAAI,GACtDC,QAAQ;MACRC,OAAO;QACL;UACE1C,IAAIgC,QAAQhC;QACd;QACA;UACEC;QACF;;IAEJ,CAAA;AACA,QAAI,CAACqC,QAAQ;AACX,YAAM5B,MAAM,eAAesB,QAAQhC,EAAE,mBAAmBD,KAAKE,aAAa,qBAAqB;IACjG;AACA,UAAM,KAAKsB,gBAAgBc,iBAAiB;MAC1C,GAAGC;MACH,GAAGN;MACH/B;MACAC,YAAY,KAAKyB,QAAO;IAC1B,CAAA;AACA,SAAKV,oBAAoBe,QAAQI;AACjC,WAAO;MAAE,GAAGE;MAAQ,GAAGN;IAAQ;EACjC;EAEA,MAAMW,mBAAqC;AACzC,UAAM,KAAKpB,gBAAgBqB,iBAAiB;MAAE5C,IAAI,KAAKqB,QAAQrB;MAAIC,eAAe,KAAKoB,QAAQpB;IAAc,CAAA;AAC7G,WAAOuB,QAAQqB,QAAQ,IAAA;EACzB;EAEQC,uBAAuBC,YAAkE;AAC/F,WAAOA,sBAAsBC;EAC/B;EAEQC,wBAAwBF,YAAmE;AACjG,WAAOA,sBAAsBG;EAC/B;EAEQC,4BAA4BJ,YAAuE;AACzG,WAAOA,sBAAsBK;EAC/B;EAEA,MAAMC,sBAAsBtD,MAGzB;AACD,UAAMgD,aAA+BhD,KAAKgD,aAAahD,KAAKgD,aAAaO,yBAAyB,MAAM,KAAKC,cAAa,CAAA;AAC1H,UAAMC,kBAAkB,MAAM,KAAKjC,gBAAgB8B,sBAAsB;MAAE,GAAGtD;MAAM0D,cAAcV,WAAW/C;IAAG,CAAA;AAEhH,QAAI,KAAK8C,uBAAuBC,UAAAA,GAAa;AAC3C,aAAO;QACLW,kBAAkB;UAChB1D,IAAI,GAAG+C,WAAW/C,EAAE,IAAIwD,gBAAgBG,eAAe;UACvDnB,MAAM;UACNoB,eAAeb,WAAWa,iBAAiB;UAC3CD,iBAAiB,KAAKH,gBAAgBG;UACtCE,sBAAsBd,WAAW/C;QACnC;QACAwD;MACF;IACF,WAAW,KAAKP,wBAAwBF,UAAAA,GAAa;AACnD,aAAO;QACLW,kBAAkB;UAChB1D,IAAI,GAAG+C,WAAW/C,EAAE,IAAIwD,gBAAgBG,eAAe;UACvDnB,MAAM;UACNN,eAAea,WAAWb;UAC1ByB,iBAAiB,KAAKH,gBAAgBG;UACtCE,sBAAsBd,WAAW/C;UACjC8D,WAAWf,WAAWe;QACxB;QACAN;MACF;IACF,WAAW,KAAKL,4BAA4BJ,UAAAA,GAAa;AACvD,aAAO;QACLW,kBAAkB;UAChB1D,IAAI,GAAG+C,WAAW/C,EAAE,IAAIwD,gBAAgBG,eAAe;UACvDnB,MAAM;UACNoB,eAAeb,WAAWa;UAC1BD,iBAAiB,KAAKH,gBAAgBG;UACtCE,sBAAsBd,WAAW/C;UACjCkC,eAAea,WAAWb;QAC5B;QACAsB;MACF;IACF;AAEA,UAAM,IAAI9C,MAAM,iCAAiC,OAAOqC,UAAAA,EAAY;EACtE;EAEA,MAAMgB,iCAAiChE,MAA0F;AAC/H,WAAO,MAAM,KAAKwB,gBAAgBwC,iCAAiChE,IAAAA;EACrE;EAEA,MAAMiE,0BAA0BjE,MAAmF;AACjH,WAAO,MAAM,KAAKwB,gBAAgByC,0BAA0BjE,IAAAA;EAC9D;EAEA,MAAMkE,4BAA4BlE,MAAoD;AACpF,QAAImE,SAAS;AACb,QAAIC,QAAQ;AACZ,WAAOD,SAAS,GAAG;AAEjBA,eAAS,MAAM,KAAKE,gCAAgCD,SAASpE,IAAAA;IAC/D;AACA,WAAOmE;EACT;EAEA,MAAcE,gCAAgCD,OAAepE,MAAoD;AAC/G,UAAM0D,eAAe,KAAKpC,QAAQrB;AAClC,UAAMC,gBAAgBF,MAAME,iBAAiB,KAAKoB,QAAQpB;AAC1D,QAAIkE,SAAS,IAAI;AACf,YAAMzD,MAAM,sFAAsF+C,YAAAA,EAAc;IAClH;AAEA,UAAMrB,SAAS,MAAM,KAAKiC,oBAAoBtE,IAAAA;AAC9C,UAAM4D,kBAAkBW,MAAMC,KAAK;MAAEnC,QAAQ;IAAG,GAAG,MAAMoC,KAAKC,MAAMD,KAAKE,OAAM,IAAKtC,MAAAA,CAAAA;AACpF,UAAMuC,YAAY,MAAM,KAAKpD,gBAAgBqD,2BAA2B;MACtEnB;MACA,GAAIxD,iBAAiB;QAAEA;MAAc;MACrC0D;IACF,CAAA;AACA,QAAIgB,UAAUvC,SAAS,GAAG;AACxB,aAAOuC,UAAU,CAAA;IACnB;AACA,WAAO;EACT;EAEA,MAAMN,oBAAoBtE,MAAoD;AAC5E,QAAI,CAAC,KAAKkB,mBAAmB;AAC3B,WAAKA,oBAAoB,MAAM,KAAKsC,cAAcxD,IAAAA,EAAM8E,KAAK,CAAC7C,YAAYA,QAAQI,MAAM;IAC1F;AACA,WAAO,KAAKnB;EACd;EAEA,MAAMsC,cAAcxD,MAA8D;AAChF,UAAMC,KAAK,KAAKqB,QAAQrB;AACxB,UAAMC,gBAAgBF,MAAME,iBAAiB,KAAKoB,QAAQpB;AAC1D,WAAO,MAAM,KAAKsB,gBAAgBgC,cAAc;MAAEvD;MAAIC;IAAc,CAAA,EAAG4E,KAAK,CAACC,yBAC3E7C,+CAA8B;MAC5B4B,sBAAsBiB,iBAAiBjB;MACvC3B,eAAe4C,iBAAiB5C;IAClC,CAAA,CAAA;EAEJ;EAEA,MAAM6C,iBAAmD;AACvD,UAAMC,cAAc,MAAM,KAAKzD,gBAAgBwD,eAAe,CAAC,CAAA;AAC/D,WAAOvD,QAAQyD,IACbD,YAAYE,IAAI,OAAOJ,qBAAAA;AACrB,iBAAO7C,+CAA8B;QACnC4B,sBAAsBiB,iBAAiBjB;MACzC,CAAA;IACF,CAAA,CAAA;EAEJ;EAEAsB,yBAA2C;AACzC,WAAO3D,QAAQqB,QAAQ,KAAA;EACzB;AACF;","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './drivers'\n","import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListArgs,\n IAddStatusListEntryArgs,\n IBitstringStatusListEntryEntity,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\n createCredentialStatusFromStatusList,\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredential, StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListType: StatusListType\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n bitsPerStatus?: number\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n\n // Get implementation details\n const implementationResult = await statusListCredentialToDetails({\n ...args,\n correlationId,\n driverType: this.getType(),\n bitsPerStatus: args.bitsPerStatus,\n })\n\n // Add driver-specific fields to create complete entity\n const statusListArgs = {\n ...implementationResult,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.addStatusList(statusListArgs)\n this._statusListLength = implementationResult.length\n return implementationResult\n }\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n statusListType: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.statusListType)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n\n // Merge details with existing entity and driver properties\n const updateArgs = {\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.updateStatusList(updateArgs)\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity\n }> {\n // Get status list entity\n const statusListEntity: StatusListEntity = statusListResultToEntity(await this.getStatusList())\n\n // Update the entry in the store\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusListEntity.id })\n\n // Use implementation to create the credential status - this moves type-specific logic to implementations\n const credentialStatus = await createCredentialStatusFromStatusList({\n statusList: statusListEntity,\n statusListEntry,\n statusListIndex: statusListEntry.statusListIndex,\n })\n\n return {\n credentialStatus,\n statusListEntry,\n }\n }\n\n async getStatusListEntryByCredentialId(\n args: IGetStatusListEntryByCredentialIdArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(\n args: IGetStatusListEntryByIndexArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore.getStatusList({ id, correlationId }).then((statusListEntity: IStatusListEntity) =>\n statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n bitsPerStatus: statusListEntity.bitsPerStatus,\n }),\n )\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity | BitstringStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n } else if (result.type === StatusListType.BitstringStatusList) {\n if (!result.bitstringStatusList) {\n throw new Error('Missing bitstringStatusList details')\n }\n return Object.assign(new BitstringStatusListEntity(), {\n ...baseFields,\n statusPurpose: result.bitstringStatusList.statusPurpose,\n ttl: result.bitstringStatusList.ttl,\n bitsPerStatus: result.bitstringStatusList.bitsPerStatus,\n validFrom: result.bitstringStatusList.validFrom,\n validUntil: result.bitstringStatusList.validUntil,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_types","statusListResultToEntity","result","baseFields","id","correlationId","driverType","credentialIdMode","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","Object","assign","StatusList2021Entity","indexingDirection","statusPurpose","OAuthStatusList","oauthStatusList","OAuthStatusListEntity","bitsPerStatus","expiresAt","BitstringStatusList","bitstringStatusList","BitstringStatusListEntity","ttl","validFrom","validUntil","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","constructor","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","implementationResult","statusListCredentialToDetails","bitsPerStatus","statusListArgs","addStatusList","length","updateStatusList","details","entity","getStatusListRepo","statusListType","findOne","where","updateArgs","deleteStatusList","removeStatusList","resolve","updateStatusListEntry","statusListEntity","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","createCredentialStatusFromStatusList","statusList","statusListIndex","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","type","statusListCredential","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution';
|
|
2
|
-
import { StatusListStore, IAddStatusListEntryArgs, IStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
|
|
2
|
+
import { StatusListStore, IAddStatusListEntryArgs, IStatusListEntryEntity, IBitstringStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
|
|
3
3
|
import { StatusListResult, StatusList2021EntryCredentialStatus, StatusListOAuthEntryCredentialStatus, BitstringStatusListEntryCredentialStatus, IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list';
|
|
4
|
-
import { StatusListDriverType, StatusListCredential, StatusListCredentialIdMode
|
|
5
|
-
import { IDataStoreORM, IDIDManager, IKeyManager, ICredentialIssuer, ICredentialVerifier,
|
|
4
|
+
import { StatusListDriverType, StatusListType, StatusListCredential, StatusListCredentialIdMode } from '@sphereon/ssi-types';
|
|
5
|
+
import { IDataStoreORM, IDIDManager, IKeyManager, ICredentialIssuer, ICredentialVerifier, IResolver, IAgentContext } from '@veramo/core';
|
|
6
6
|
import { DataSources } from '@sphereon/ssi-sdk.agent-config';
|
|
7
7
|
import { DataSource } from 'typeorm';
|
|
8
|
+
import { IVcdmCredentialPlugin } from '@sphereon/ssi-sdk.credential-vcdm';
|
|
8
9
|
|
|
9
10
|
interface StatusListManagementOptions {
|
|
10
11
|
id?: string;
|
|
@@ -46,6 +47,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
46
47
|
getOptions(): DriverOptions;
|
|
47
48
|
getType(): StatusListDriverType;
|
|
48
49
|
createStatusList(args: {
|
|
50
|
+
statusListType: StatusListType;
|
|
49
51
|
statusListCredential: StatusListCredential;
|
|
50
52
|
correlationId?: string;
|
|
51
53
|
credentialIdMode?: StatusListCredentialIdMode;
|
|
@@ -54,18 +56,15 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
54
56
|
updateStatusList(args: {
|
|
55
57
|
statusListCredential: StatusListCredential;
|
|
56
58
|
correlationId: string;
|
|
57
|
-
|
|
59
|
+
statusListType: StatusListType;
|
|
58
60
|
}): Promise<StatusListResult>;
|
|
59
61
|
deleteStatusList(): Promise<boolean>;
|
|
60
|
-
private isStatusList2021Entity;
|
|
61
|
-
private isOAuthStatusListEntity;
|
|
62
|
-
private isBitstringStatusListEntity;
|
|
63
62
|
updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{
|
|
64
63
|
credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus;
|
|
65
|
-
statusListEntry: IStatusListEntryEntity;
|
|
64
|
+
statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity;
|
|
66
65
|
}>;
|
|
67
|
-
getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined>;
|
|
68
|
-
getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined>;
|
|
66
|
+
getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
|
|
67
|
+
getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
|
|
69
68
|
getRandomNewStatusListIndex(args?: {
|
|
70
69
|
correlationId?: string;
|
|
71
70
|
}): Promise<number>;
|
|
@@ -80,7 +79,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
80
79
|
isStatusListIndexInUse(): Promise<boolean>;
|
|
81
80
|
}
|
|
82
81
|
|
|
83
|
-
type IRequiredPlugins = IDataStoreORM & IDIDManager & IKeyManager & IIdentifierResolution & ICredentialIssuer & ICredentialVerifier &
|
|
82
|
+
type IRequiredPlugins = IDataStoreORM & IDIDManager & IKeyManager & IIdentifierResolution & ICredentialIssuer & ICredentialVerifier & IVcdmCredentialPlugin & IStatusListPlugin & IResolver;
|
|
84
83
|
type IRequiredContext = IAgentContext<IRequiredPlugins>;
|
|
85
84
|
interface IStatusListDriver {
|
|
86
85
|
statusListStore: StatusListStore;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution';
|
|
2
|
-
import { StatusListStore, IAddStatusListEntryArgs, IStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
|
|
2
|
+
import { StatusListStore, IAddStatusListEntryArgs, IStatusListEntryEntity, IBitstringStatusListEntryEntity, IGetStatusListEntryByCredentialIdArgs, IGetStatusListEntryByIndexArgs } from '@sphereon/ssi-sdk.data-store';
|
|
3
3
|
import { StatusListResult, StatusList2021EntryCredentialStatus, StatusListOAuthEntryCredentialStatus, BitstringStatusListEntryCredentialStatus, IStatusListPlugin } from '@sphereon/ssi-sdk.vc-status-list';
|
|
4
|
-
import { StatusListDriverType, StatusListCredential, StatusListCredentialIdMode
|
|
5
|
-
import { IDataStoreORM, IDIDManager, IKeyManager, ICredentialIssuer, ICredentialVerifier,
|
|
4
|
+
import { StatusListDriverType, StatusListType, StatusListCredential, StatusListCredentialIdMode } from '@sphereon/ssi-types';
|
|
5
|
+
import { IDataStoreORM, IDIDManager, IKeyManager, ICredentialIssuer, ICredentialVerifier, IResolver, IAgentContext } from '@veramo/core';
|
|
6
6
|
import { DataSources } from '@sphereon/ssi-sdk.agent-config';
|
|
7
7
|
import { DataSource } from 'typeorm';
|
|
8
|
+
import { IVcdmCredentialPlugin } from '@sphereon/ssi-sdk.credential-vcdm';
|
|
8
9
|
|
|
9
10
|
interface StatusListManagementOptions {
|
|
10
11
|
id?: string;
|
|
@@ -46,6 +47,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
46
47
|
getOptions(): DriverOptions;
|
|
47
48
|
getType(): StatusListDriverType;
|
|
48
49
|
createStatusList(args: {
|
|
50
|
+
statusListType: StatusListType;
|
|
49
51
|
statusListCredential: StatusListCredential;
|
|
50
52
|
correlationId?: string;
|
|
51
53
|
credentialIdMode?: StatusListCredentialIdMode;
|
|
@@ -54,18 +56,15 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
54
56
|
updateStatusList(args: {
|
|
55
57
|
statusListCredential: StatusListCredential;
|
|
56
58
|
correlationId: string;
|
|
57
|
-
|
|
59
|
+
statusListType: StatusListType;
|
|
58
60
|
}): Promise<StatusListResult>;
|
|
59
61
|
deleteStatusList(): Promise<boolean>;
|
|
60
|
-
private isStatusList2021Entity;
|
|
61
|
-
private isOAuthStatusListEntity;
|
|
62
|
-
private isBitstringStatusListEntity;
|
|
63
62
|
updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{
|
|
64
63
|
credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus;
|
|
65
|
-
statusListEntry: IStatusListEntryEntity;
|
|
64
|
+
statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity;
|
|
66
65
|
}>;
|
|
67
|
-
getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined>;
|
|
68
|
-
getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined>;
|
|
66
|
+
getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
|
|
67
|
+
getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined>;
|
|
69
68
|
getRandomNewStatusListIndex(args?: {
|
|
70
69
|
correlationId?: string;
|
|
71
70
|
}): Promise<number>;
|
|
@@ -80,7 +79,7 @@ declare class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
80
79
|
isStatusListIndexInUse(): Promise<boolean>;
|
|
81
80
|
}
|
|
82
81
|
|
|
83
|
-
type IRequiredPlugins = IDataStoreORM & IDIDManager & IKeyManager & IIdentifierResolution & ICredentialIssuer & ICredentialVerifier &
|
|
82
|
+
type IRequiredPlugins = IDataStoreORM & IDIDManager & IKeyManager & IIdentifierResolution & ICredentialIssuer & ICredentialVerifier & IVcdmCredentialPlugin & IStatusListPlugin & IResolver;
|
|
84
83
|
type IRequiredContext = IAgentContext<IRequiredPlugins>;
|
|
85
84
|
interface IStatusListDriver {
|
|
86
85
|
statusListStore: StatusListStore;
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,8 @@ 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 {
|
|
7
|
-
import { statusListCredentialToDetails } from "@sphereon/ssi-sdk.vc-status-list";
|
|
6
|
+
import { StatusListStore } from "@sphereon/ssi-sdk.data-store";
|
|
7
|
+
import { createCredentialStatusFromStatusList, 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
|
|
@@ -48,6 +48,7 @@ function statusListResultToEntity(result) {
|
|
|
48
48
|
...baseFields,
|
|
49
49
|
statusPurpose: result.bitstringStatusList.statusPurpose,
|
|
50
50
|
ttl: result.bitstringStatusList.ttl,
|
|
51
|
+
bitsPerStatus: result.bitstringStatusList.bitsPerStatus,
|
|
51
52
|
validFrom: result.bitstringStatusList.validFrom,
|
|
52
53
|
validUntil: result.bitstringStatusList.validUntil
|
|
53
54
|
});
|
|
@@ -142,23 +143,21 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
142
143
|
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");
|
|
143
144
|
}
|
|
144
145
|
const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE;
|
|
145
|
-
const
|
|
146
|
+
const implementationResult = await statusListCredentialToDetails({
|
|
146
147
|
...args,
|
|
147
148
|
correlationId,
|
|
148
149
|
driverType: this.getType(),
|
|
149
150
|
bitsPerStatus: args.bitsPerStatus
|
|
150
151
|
});
|
|
151
|
-
|
|
152
|
-
...
|
|
152
|
+
const statusListArgs = {
|
|
153
|
+
...implementationResult,
|
|
153
154
|
credentialIdMode,
|
|
154
155
|
correlationId,
|
|
155
|
-
...args.bitsPerStatus && {
|
|
156
|
-
bitsPerStatus: args.bitsPerStatus
|
|
157
|
-
},
|
|
158
156
|
driverType: this.getType()
|
|
159
|
-
}
|
|
160
|
-
this.
|
|
161
|
-
|
|
157
|
+
};
|
|
158
|
+
await this.statusListStore.addStatusList(statusListArgs);
|
|
159
|
+
this._statusListLength = implementationResult.length;
|
|
160
|
+
return implementationResult;
|
|
162
161
|
}
|
|
163
162
|
async updateStatusList(args) {
|
|
164
163
|
const correlationId = args.correlationId ?? this.options.correlationId;
|
|
@@ -167,7 +166,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
167
166
|
correlationId,
|
|
168
167
|
driverType: this.getType()
|
|
169
168
|
});
|
|
170
|
-
const entity = await (await this.statusListStore.getStatusListRepo(args.
|
|
169
|
+
const entity = await (await this.statusListStore.getStatusListRepo(args.statusListType)).findOne({
|
|
171
170
|
where: [
|
|
172
171
|
{
|
|
173
172
|
id: details.id
|
|
@@ -180,12 +179,13 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
180
179
|
if (!entity) {
|
|
181
180
|
throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`);
|
|
182
181
|
}
|
|
183
|
-
|
|
182
|
+
const updateArgs = {
|
|
184
183
|
...entity,
|
|
185
184
|
...details,
|
|
186
185
|
correlationId,
|
|
187
186
|
driverType: this.getType()
|
|
188
|
-
}
|
|
187
|
+
};
|
|
188
|
+
await this.statusListStore.updateStatusList(updateArgs);
|
|
189
189
|
this._statusListLength = details.length;
|
|
190
190
|
return {
|
|
191
191
|
...entity,
|
|
@@ -199,58 +199,21 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
199
199
|
});
|
|
200
200
|
return Promise.resolve(true);
|
|
201
201
|
}
|
|
202
|
-
isStatusList2021Entity(statusList) {
|
|
203
|
-
return statusList instanceof StatusList2021Entity2;
|
|
204
|
-
}
|
|
205
|
-
isOAuthStatusListEntity(statusList) {
|
|
206
|
-
return statusList instanceof OAuthStatusListEntity2;
|
|
207
|
-
}
|
|
208
|
-
isBitstringStatusListEntity(statusList) {
|
|
209
|
-
return statusList instanceof BitstringStatusListEntity2;
|
|
210
|
-
}
|
|
211
202
|
async updateStatusListEntry(args) {
|
|
212
|
-
const
|
|
203
|
+
const statusListEntity = statusListResultToEntity(await this.getStatusList());
|
|
213
204
|
const statusListEntry = await this.statusListStore.updateStatusListEntry({
|
|
214
205
|
...args,
|
|
215
|
-
statusListId:
|
|
206
|
+
statusListId: statusListEntity.id
|
|
216
207
|
});
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
statusListEntry
|
|
227
|
-
};
|
|
228
|
-
} else if (this.isOAuthStatusListEntity(statusList)) {
|
|
229
|
-
return {
|
|
230
|
-
credentialStatus: {
|
|
231
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
232
|
-
type: "OAuthStatusListEntry",
|
|
233
|
-
bitsPerStatus: statusList.bitsPerStatus,
|
|
234
|
-
statusListIndex: "" + statusListEntry.statusListIndex,
|
|
235
|
-
statusListCredential: statusList.id,
|
|
236
|
-
expiresAt: statusList.expiresAt
|
|
237
|
-
},
|
|
238
|
-
statusListEntry
|
|
239
|
-
};
|
|
240
|
-
} else if (this.isBitstringStatusListEntity(statusList)) {
|
|
241
|
-
return {
|
|
242
|
-
credentialStatus: {
|
|
243
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
244
|
-
type: "BitstringStatusListEntry",
|
|
245
|
-
statusPurpose: statusList.statusPurpose,
|
|
246
|
-
statusListIndex: "" + statusListEntry.statusListIndex,
|
|
247
|
-
statusListCredential: statusList.id,
|
|
248
|
-
bitsPerStatus: statusList.bitsPerStatus
|
|
249
|
-
},
|
|
250
|
-
statusListEntry
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
throw new Error(`Unsupported status list type: ${typeof statusList}`);
|
|
208
|
+
const credentialStatus = await createCredentialStatusFromStatusList({
|
|
209
|
+
statusList: statusListEntity,
|
|
210
|
+
statusListEntry,
|
|
211
|
+
statusListIndex: statusListEntry.statusListIndex
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
credentialStatus,
|
|
215
|
+
statusListEntry
|
|
216
|
+
};
|
|
254
217
|
}
|
|
255
218
|
async getStatusListEntryByCredentialId(args) {
|
|
256
219
|
return await this.statusListStore.getStatusListEntryByCredentialId(args);
|
|
@@ -301,6 +264,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
301
264
|
id,
|
|
302
265
|
correlationId
|
|
303
266
|
}).then((statusListEntity) => statusListCredentialToDetails({
|
|
267
|
+
statusListType: statusListEntity.type,
|
|
304
268
|
statusListCredential: statusListEntity.statusListCredential,
|
|
305
269
|
bitsPerStatus: statusListEntity.bitsPerStatus
|
|
306
270
|
}));
|
|
@@ -309,6 +273,7 @@ var AgentDataSourceStatusListDriver = class _AgentDataSourceStatusListDriver {
|
|
|
309
273
|
const statusLists = await this.statusListStore.getStatusLists({});
|
|
310
274
|
return Promise.all(statusLists.map(async (statusListEntity) => {
|
|
311
275
|
return statusListCredentialToDetails({
|
|
276
|
+
statusListType: statusListEntity.type,
|
|
312
277
|
statusListCredential: statusListEntity.statusListCredential
|
|
313
278
|
});
|
|
314
279
|
}));
|
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 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 bitsPerStatus: statusList.bitsPerStatus,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListArgs,\n IAddStatusListEntryArgs,\n IBitstringStatusListEntryEntity,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n BitstringStatusListEntryCredentialStatus,\n createCredentialStatusFromStatusList,\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredential, StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListType: StatusListType\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n bitsPerStatus?: number\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n\n // Get implementation details\n const implementationResult = await statusListCredentialToDetails({\n ...args,\n correlationId,\n driverType: this.getType(),\n bitsPerStatus: args.bitsPerStatus,\n })\n\n // Add driver-specific fields to create complete entity\n const statusListArgs = {\n ...implementationResult,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.addStatusList(statusListArgs)\n this._statusListLength = implementationResult.length\n return implementationResult\n }\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n statusListType: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.statusListType)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n\n // Merge details with existing entity and driver properties\n const updateArgs = {\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n } as IAddStatusListArgs\n\n await this.statusListStore.updateStatusList(updateArgs)\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity\n }> {\n // Get status list entity\n const statusListEntity: StatusListEntity = statusListResultToEntity(await this.getStatusList())\n\n // Update the entry in the store\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusListEntity.id })\n\n // Use implementation to create the credential status - this moves type-specific logic to implementations\n const credentialStatus = await createCredentialStatusFromStatusList({\n statusList: statusListEntity,\n statusListEntry,\n statusListIndex: statusListEntry.statusListIndex,\n })\n\n return {\n credentialStatus,\n statusListEntry,\n }\n }\n\n async getStatusListEntryByCredentialId(\n args: IGetStatusListEntryByCredentialIdArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(\n args: IGetStatusListEntryByIndexArgs,\n ): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore.getStatusList({ id, correlationId }).then((statusListEntity: IStatusListEntity) =>\n statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n bitsPerStatus: statusListEntity.bitsPerStatus,\n }),\n )\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListType: statusListEntity.type,\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { BitstringStatusListEntity, OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity | BitstringStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n } else if (result.type === StatusListType.BitstringStatusList) {\n if (!result.bitstringStatusList) {\n throw new Error('Missing bitstringStatusList details')\n }\n return Object.assign(new BitstringStatusListEntity(), {\n ...baseFields,\n statusPurpose: result.bitstringStatusList.statusPurpose,\n ttl: result.bitstringStatusList.ttl,\n bitsPerStatus: result.bitstringStatusList.bitsPerStatus,\n validFrom: result.bitstringStatusList.validFrom,\n validUntil: result.bitstringStatusList.validUntil,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["DataSources","StatusListStore","createCredentialStatusFromStatusList","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","implementationResult","statusListCredentialToDetails","bitsPerStatus","statusListArgs","addStatusList","length","updateStatusList","details","entity","getStatusListRepo","statusListType","findOne","where","updateArgs","deleteStatusList","removeStatusList","resolve","updateStatusListEntry","statusListEntity","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","createCredentialStatusFromStatusList","statusList","statusListIndex","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","type","statusListCredential","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
|
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.
|
|
4
|
+
"version": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|
|
@@ -22,14 +22,15 @@
|
|
|
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.
|
|
25
|
+
"@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
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.
|
|
29
|
-
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.
|
|
30
|
-
"@sphereon/ssi-sdk.
|
|
31
|
-
"@sphereon/ssi-sdk.
|
|
32
|
-
"@sphereon/ssi-
|
|
28
|
+
"@sphereon/ssi-sdk.agent-config": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
29
|
+
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
30
|
+
"@sphereon/ssi-sdk.credential-vcdm": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
31
|
+
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
32
|
+
"@sphereon/ssi-sdk.vc-status-list": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
33
|
+
"@sphereon/ssi-types": "0.34.1-feature.SSISDK.17.bitstring.sl.13+61bcf6d3",
|
|
33
34
|
"@sphereon/vc-status-list": "7.0.0-next.0",
|
|
34
35
|
"@veramo/core": "4.2.0",
|
|
35
36
|
"debug": "^4.3.5",
|
|
@@ -60,5 +61,5 @@
|
|
|
60
61
|
"SSI",
|
|
61
62
|
"StatusList2021"
|
|
62
63
|
],
|
|
63
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "61bcf6d37bcb3d77036b5415d72853c3ba3f9273"
|
|
64
65
|
}
|
package/src/drivers.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { DataSources } from '@sphereon/ssi-sdk.agent-config'
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
IAddStatusListArgs,
|
|
4
4
|
IAddStatusListEntryArgs,
|
|
5
|
+
IBitstringStatusListEntryEntity,
|
|
5
6
|
IGetStatusListEntryByCredentialIdArgs,
|
|
6
7
|
IGetStatusListEntryByIndexArgs,
|
|
7
8
|
IStatusListEntity,
|
|
8
9
|
IStatusListEntryEntity,
|
|
9
|
-
OAuthStatusListEntity,
|
|
10
|
-
StatusList2021Entity,
|
|
11
10
|
StatusListEntity,
|
|
12
11
|
StatusListStore,
|
|
13
12
|
} from '@sphereon/ssi-sdk.data-store'
|
|
14
13
|
import {
|
|
15
14
|
BitstringStatusListEntryCredentialStatus,
|
|
15
|
+
createCredentialStatusFromStatusList,
|
|
16
16
|
StatusList2021EntryCredentialStatus,
|
|
17
17
|
statusListCredentialToDetails,
|
|
18
18
|
StatusListOAuthEntryCredentialStatus,
|
|
@@ -132,6 +132,7 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
async createStatusList(args: {
|
|
135
|
+
statusListType: StatusListType
|
|
135
136
|
statusListCredential: StatusListCredential
|
|
136
137
|
correlationId?: string
|
|
137
138
|
credentialIdMode?: StatusListCredentialIdMode
|
|
@@ -142,29 +143,36 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
142
143
|
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')
|
|
143
144
|
}
|
|
144
145
|
const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE
|
|
145
|
-
const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType(), bitsPerStatus: args.bitsPerStatus })
|
|
146
146
|
|
|
147
|
-
//
|
|
148
|
-
await
|
|
149
|
-
...
|
|
150
|
-
credentialIdMode,
|
|
147
|
+
// Get implementation details
|
|
148
|
+
const implementationResult = await statusListCredentialToDetails({
|
|
149
|
+
...args,
|
|
151
150
|
correlationId,
|
|
152
|
-
...(args.bitsPerStatus && { bitsPerStatus: args.bitsPerStatus }),
|
|
153
151
|
driverType: this.getType(),
|
|
152
|
+
bitsPerStatus: args.bitsPerStatus,
|
|
154
153
|
})
|
|
155
|
-
this._statusListLength = details.length
|
|
156
|
-
return details
|
|
157
|
-
}
|
|
158
154
|
|
|
155
|
+
// Add driver-specific fields to create complete entity
|
|
156
|
+
const statusListArgs = {
|
|
157
|
+
...implementationResult,
|
|
158
|
+
credentialIdMode,
|
|
159
|
+
correlationId,
|
|
160
|
+
driverType: this.getType(),
|
|
161
|
+
} as IAddStatusListArgs
|
|
162
|
+
|
|
163
|
+
await this.statusListStore.addStatusList(statusListArgs)
|
|
164
|
+
this._statusListLength = implementationResult.length
|
|
165
|
+
return implementationResult
|
|
166
|
+
}
|
|
159
167
|
async updateStatusList(args: {
|
|
160
168
|
statusListCredential: StatusListCredential
|
|
161
169
|
correlationId: string
|
|
162
|
-
|
|
170
|
+
statusListType: StatusListType
|
|
163
171
|
}): Promise<StatusListResult> {
|
|
164
172
|
const correlationId = args.correlationId ?? this.options.correlationId
|
|
165
173
|
const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })
|
|
166
174
|
const entity = await (
|
|
167
|
-
await this.statusListStore.getStatusListRepo(args.
|
|
175
|
+
await this.statusListStore.getStatusListRepo(args.statusListType)
|
|
168
176
|
).findOne({
|
|
169
177
|
where: [
|
|
170
178
|
{
|
|
@@ -178,12 +186,16 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
178
186
|
if (!entity) {
|
|
179
187
|
throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)
|
|
180
188
|
}
|
|
181
|
-
|
|
189
|
+
|
|
190
|
+
// Merge details with existing entity and driver properties
|
|
191
|
+
const updateArgs = {
|
|
182
192
|
...entity,
|
|
183
193
|
...details,
|
|
184
194
|
correlationId,
|
|
185
195
|
driverType: this.getType(),
|
|
186
|
-
}
|
|
196
|
+
} as IAddStatusListArgs
|
|
197
|
+
|
|
198
|
+
await this.statusListStore.updateStatusList(updateArgs)
|
|
187
199
|
this._statusListLength = details.length
|
|
188
200
|
return { ...entity, ...details }
|
|
189
201
|
}
|
|
@@ -193,70 +205,38 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
193
205
|
return Promise.resolve(true)
|
|
194
206
|
}
|
|
195
207
|
|
|
196
|
-
private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {
|
|
197
|
-
return statusList instanceof StatusList2021Entity
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {
|
|
201
|
-
return statusList instanceof OAuthStatusListEntity
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
private isBitstringStatusListEntity(statusList: StatusListEntity): statusList is BitstringStatusListEntity {
|
|
205
|
-
return statusList instanceof BitstringStatusListEntity
|
|
206
|
-
}
|
|
207
|
-
|
|
208
208
|
async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{
|
|
209
209
|
credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus | BitstringStatusListEntryCredentialStatus
|
|
210
|
-
statusListEntry: IStatusListEntryEntity
|
|
210
|
+
statusListEntry: IStatusListEntryEntity | IBitstringStatusListEntryEntity
|
|
211
211
|
}> {
|
|
212
|
-
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
credentialStatus: {
|
|
218
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
219
|
-
type: 'StatusList2021Entry',
|
|
220
|
-
statusPurpose: statusList.statusPurpose ?? 'revocation',
|
|
221
|
-
statusListIndex: '' + statusListEntry.statusListIndex,
|
|
222
|
-
statusListCredential: statusList.id,
|
|
223
|
-
},
|
|
224
|
-
statusListEntry,
|
|
225
|
-
}
|
|
226
|
-
} else if (this.isOAuthStatusListEntity(statusList)) {
|
|
227
|
-
return {
|
|
228
|
-
credentialStatus: {
|
|
229
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
230
|
-
type: 'OAuthStatusListEntry',
|
|
231
|
-
bitsPerStatus: statusList.bitsPerStatus,
|
|
232
|
-
statusListIndex: '' + statusListEntry.statusListIndex,
|
|
233
|
-
statusListCredential: statusList.id,
|
|
234
|
-
expiresAt: statusList.expiresAt,
|
|
235
|
-
},
|
|
236
|
-
statusListEntry,
|
|
237
|
-
}
|
|
238
|
-
} else if (this.isBitstringStatusListEntity(statusList)) {
|
|
239
|
-
return {
|
|
240
|
-
credentialStatus: {
|
|
241
|
-
id: `${statusList.id}#${statusListEntry.statusListIndex}`,
|
|
242
|
-
type: 'BitstringStatusListEntry',
|
|
243
|
-
statusPurpose: statusList.statusPurpose,
|
|
244
|
-
statusListIndex: '' + statusListEntry.statusListIndex,
|
|
245
|
-
statusListCredential: statusList.id,
|
|
246
|
-
bitsPerStatus: statusList.bitsPerStatus,
|
|
247
|
-
} satisfies BitstringStatusListEntryCredentialStatus,
|
|
248
|
-
statusListEntry,
|
|
249
|
-
}
|
|
250
|
-
}
|
|
212
|
+
// Get status list entity
|
|
213
|
+
const statusListEntity: StatusListEntity = statusListResultToEntity(await this.getStatusList())
|
|
214
|
+
|
|
215
|
+
// Update the entry in the store
|
|
216
|
+
const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusListEntity.id })
|
|
251
217
|
|
|
252
|
-
|
|
218
|
+
// Use implementation to create the credential status - this moves type-specific logic to implementations
|
|
219
|
+
const credentialStatus = await createCredentialStatusFromStatusList({
|
|
220
|
+
statusList: statusListEntity,
|
|
221
|
+
statusListEntry,
|
|
222
|
+
statusListIndex: statusListEntry.statusListIndex,
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
return {
|
|
226
|
+
credentialStatus,
|
|
227
|
+
statusListEntry,
|
|
228
|
+
}
|
|
253
229
|
}
|
|
254
230
|
|
|
255
|
-
async getStatusListEntryByCredentialId(
|
|
231
|
+
async getStatusListEntryByCredentialId(
|
|
232
|
+
args: IGetStatusListEntryByCredentialIdArgs,
|
|
233
|
+
): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {
|
|
256
234
|
return await this.statusListStore.getStatusListEntryByCredentialId(args)
|
|
257
235
|
}
|
|
258
236
|
|
|
259
|
-
async getStatusListEntryByIndex(
|
|
237
|
+
async getStatusListEntryByIndex(
|
|
238
|
+
args: IGetStatusListEntryByIndexArgs,
|
|
239
|
+
): Promise<IStatusListEntryEntity | IBitstringStatusListEntryEntity | undefined> {
|
|
260
240
|
return await this.statusListStore.getStatusListEntryByIndex(args)
|
|
261
241
|
}
|
|
262
242
|
|
|
@@ -302,6 +282,7 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
302
282
|
const correlationId = args?.correlationId ?? this.options.correlationId
|
|
303
283
|
return await this.statusListStore.getStatusList({ id, correlationId }).then((statusListEntity: IStatusListEntity) =>
|
|
304
284
|
statusListCredentialToDetails({
|
|
285
|
+
statusListType: statusListEntity.type,
|
|
305
286
|
statusListCredential: statusListEntity.statusListCredential!,
|
|
306
287
|
bitsPerStatus: statusListEntity.bitsPerStatus,
|
|
307
288
|
}),
|
|
@@ -313,6 +294,7 @@ export class AgentDataSourceStatusListDriver implements IStatusListDriver {
|
|
|
313
294
|
return Promise.all(
|
|
314
295
|
statusLists.map(async (statusListEntity) => {
|
|
315
296
|
return statusListCredentialToDetails({
|
|
297
|
+
statusListType: statusListEntity.type,
|
|
316
298
|
statusListCredential: statusListEntity.statusListCredential!,
|
|
317
299
|
})
|
|
318
300
|
}),
|
|
@@ -41,6 +41,7 @@ export function statusListResultToEntity(result: StatusListResult): StatusList20
|
|
|
41
41
|
...baseFields,
|
|
42
42
|
statusPurpose: result.bitstringStatusList.statusPurpose,
|
|
43
43
|
ttl: result.bitstringStatusList.ttl,
|
|
44
|
+
bitsPerStatus: result.bitstringStatusList.bitsPerStatus,
|
|
44
45
|
validFrom: result.bitstringStatusList.validFrom,
|
|
45
46
|
validUntil: result.bitstringStatusList.validUntil,
|
|
46
47
|
})
|
package/src/types.ts
CHANGED
|
@@ -14,17 +14,9 @@ import {
|
|
|
14
14
|
StatusListResult,
|
|
15
15
|
} from '@sphereon/ssi-sdk.vc-status-list'
|
|
16
16
|
import { StatusListCredential, StatusListDriverType } from '@sphereon/ssi-types'
|
|
17
|
-
import {
|
|
18
|
-
IAgentContext,
|
|
19
|
-
ICredentialIssuer,
|
|
20
|
-
ICredentialPlugin,
|
|
21
|
-
ICredentialVerifier,
|
|
22
|
-
IDataStoreORM,
|
|
23
|
-
IDIDManager,
|
|
24
|
-
IKeyManager,
|
|
25
|
-
IResolver,
|
|
26
|
-
} from '@veramo/core'
|
|
17
|
+
import { IAgentContext, ICredentialIssuer, ICredentialVerifier, IDataStoreORM, IDIDManager, IKeyManager, IResolver } from '@veramo/core'
|
|
27
18
|
import { DriverOptions } from './drivers'
|
|
19
|
+
import { IVcdmCredentialPlugin } from '@sphereon/ssi-sdk.credential-vcdm'
|
|
28
20
|
|
|
29
21
|
export type IRequiredPlugins = IDataStoreORM &
|
|
30
22
|
IDIDManager &
|
|
@@ -32,7 +24,7 @@ export type IRequiredPlugins = IDataStoreORM &
|
|
|
32
24
|
IIdentifierResolution &
|
|
33
25
|
ICredentialIssuer &
|
|
34
26
|
ICredentialVerifier &
|
|
35
|
-
|
|
27
|
+
IVcdmCredentialPlugin &
|
|
36
28
|
IStatusListPlugin &
|
|
37
29
|
IResolver
|
|
38
30
|
export type IRequiredContext = IAgentContext<IRequiredPlugins>
|