@sphereon/ssi-sdk.vc-status-list-issuer-drivers 0.34.0 → 0.34.1-next.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './drivers'\n","import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.type)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_types","statusListResultToEntity","result","baseFields","id","correlationId","driverType","credentialIdMode","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","Object","assign","StatusList2021Entity","indexingDirection","statusPurpose","OAuthStatusList","oauthStatusList","OAuthStatusListEntity","bitsPerStatus","expiresAt","import_ssi_sdk","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","constructor","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './drivers'\n","import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.type)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["import_ssi_sdk","import_ssi_types","statusListResultToEntity","result","baseFields","id","correlationId","driverType","credentialIdMode","length","issuer","type","proofFormat","statusListCredential","StatusListType","StatusList2021","statusList2021","Error","Object","assign","StatusList2021Entity","indexingDirection","statusPurpose","OAuthStatusList","oauthStatusList","OAuthStatusListEntity","bitsPerStatus","expiresAt","import_ssi_sdk","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
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 IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.type)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["DataSources","StatusListStore","statusListCredentialToDetails","StatusListCredentialIdMode","StatusListDriverType","StatusListType","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","OAuthStatusListEntity","StatusList2021Entity","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","constructor","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
1
+ {"version":3,"sources":["../src/drivers.ts","../src/status-list-adapters.ts"],"sourcesContent":["import { DataSources } from '@sphereon/ssi-sdk.agent-config'\nimport {\n IAddStatusListEntryArgs,\n IGetStatusListEntryByCredentialIdArgs,\n IGetStatusListEntryByIndexArgs,\n IStatusListEntity,\n IStatusListEntryEntity,\n StatusListEntity,\n StatusListStore,\n} from '@sphereon/ssi-sdk.data-store'\nimport {\n StatusList2021EntryCredentialStatus,\n statusListCredentialToDetails,\n StatusListOAuthEntryCredentialStatus,\n StatusListResult,\n} from '@sphereon/ssi-sdk.vc-status-list'\nimport { StatusListCredentialIdMode, StatusListDriverType, StatusListType, StatusListCredential } from '@sphereon/ssi-types'\nimport { DataSource } from 'typeorm'\nimport { IStatusListDriver } from './types'\nimport { statusListResultToEntity } from './status-list-adapters'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\n\nexport interface StatusListManagementOptions {\n id?: string\n correlationId?: string\n driverType: StatusListDriverType\n driverOptions?: DriverOptions\n}\n\nexport type DriverOptions = TypeORMOptions\n\nexport interface TypeORMOptions {\n dbName?: string\n}\n\nexport interface FilesystemOptions {\n path: string // The base path where statusList Credentials will be persisted. Should be a folder and thus not include the VC/StatusList itself\n}\n\nexport function getOptions(args: { id?: string; correlationId?: string; dbName: string }): StatusListManagementOptions {\n return {\n id: args.id,\n correlationId: args.correlationId,\n driverType: StatusListDriverType.AGENT_TYPEORM,\n driverOptions: { dbName: args.dbName },\n }\n}\n\nexport async function getDriver(args: {\n id?: string\n correlationId?: string\n dbName?: string\n dataSource?: DataSource\n dataSources?: DataSources\n}): Promise<IStatusListDriver> {\n const dbName = args.dbName ?? args.dataSource?.name\n if (!dbName) {\n throw Error(`Please provide either a DB name or data source`)\n }\n const dataSources = args.dataSources ?? DataSources.singleInstance()\n return await AgentDataSourceStatusListDriver.init(\n getOptions({\n ...args,\n dbName,\n }),\n { dataSource: args.dataSource ?? (await dataSources.getDbConnection(dbName)), dataSources },\n )\n}\n\nexport class AgentDataSourceStatusListDriver implements IStatusListDriver {\n private _statusListLength: number | undefined\n\n constructor(\n private _dataSource: DataSource,\n private _statusListStore: StatusListStore,\n private options: StatusListManagementOptions,\n ) {}\n\n public static async init(\n options: StatusListManagementOptions,\n dbArgs?: {\n dataSources?: DataSources\n dataSource?: DataSource\n },\n ): Promise<AgentDataSourceStatusListDriver> {\n if (options.driverType !== StatusListDriverType.AGENT_TYPEORM) {\n throw Error(`TypeORM driver can only be used when the TypeORM driver type is selected in the configuration. Got: ${options.driverType}`)\n } else if (!options.driverOptions) {\n throw Error(`TypeORM driver can only be used when the TypeORM options are provided.`)\n }\n let dataSource: DataSource\n let statusListStore: StatusListStore\n if (dbArgs?.dataSource) {\n dataSource = dbArgs.dataSource\n } else if (options.driverOptions.dbName) {\n if (dbArgs?.dataSources) {\n dataSource = await dbArgs.dataSources.getDbConnection(options.driverOptions.dbName)\n } else {\n dataSource = await DataSources.singleInstance().getDbConnection(options.driverOptions.dbName)\n }\n } else {\n return Promise.reject(Error(`Either a datasource or dbName needs to be provided`))\n }\n\n statusListStore = new StatusListStore(dataSource)\n return new AgentDataSourceStatusListDriver(dataSource, statusListStore, options)\n }\n\n get dataSource(): DataSource {\n if (!this._dataSource) {\n throw Error(`Datasource not available yet for ${this.options.driverOptions?.dbName}`)\n }\n return this._dataSource\n }\n\n get statusListStore(): StatusListStore {\n if (!this._statusListStore) {\n this._statusListStore = new StatusListStore(this.dataSource)\n }\n return this._statusListStore\n }\n\n getOptions(): DriverOptions {\n return this.options.driverOptions ?? {}\n }\n\n getType(): StatusListDriverType {\n return this.options.driverType\n }\n\n async createStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId?: string\n credentialIdMode?: StatusListCredentialIdMode\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n if (!correlationId) {\n throw Error('Either a correlationId needs to be set as an option, or it needs to be provided when creating a status list. None found')\n }\n const credentialIdMode = args.credentialIdMode ?? StatusListCredentialIdMode.ISSUANCE\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n\n // (StatusListStore does the duplicate entity check)\n await this.statusListStore.addStatusList({\n ...details,\n credentialIdMode,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return details\n }\n\n async updateStatusList(args: {\n statusListCredential: StatusListCredential\n correlationId: string\n type: StatusListType\n }): Promise<StatusListResult> {\n const correlationId = args.correlationId ?? this.options.correlationId\n const details = await statusListCredentialToDetails({ ...args, correlationId, driverType: this.getType() })\n const entity = await (\n await this.statusListStore.getStatusListRepo(args.type)\n ).findOne({\n where: [\n {\n id: details.id,\n },\n {\n correlationId,\n },\n ],\n })\n if (!entity) {\n throw Error(`Status list ${details.id}, correlationId ${args.correlationId} could not be found`)\n }\n await this.statusListStore.updateStatusList({\n ...entity,\n ...details,\n correlationId,\n driverType: this.getType(),\n })\n this._statusListLength = details.length\n return { ...entity, ...details }\n }\n\n async deleteStatusList(): Promise<boolean> {\n await this.statusListStore.removeStatusList({ id: this.options.id, correlationId: this.options.correlationId })\n return Promise.resolve(true)\n }\n\n private isStatusList2021Entity(statusList: StatusListEntity): statusList is StatusList2021Entity {\n return statusList instanceof StatusList2021Entity\n }\n\n private isOAuthStatusListEntity(statusList: StatusListEntity): statusList is OAuthStatusListEntity {\n return statusList instanceof OAuthStatusListEntity\n }\n\n async updateStatusListEntry(args: IAddStatusListEntryArgs): Promise<{\n credentialStatus: StatusList2021EntryCredentialStatus | StatusListOAuthEntryCredentialStatus\n statusListEntry: IStatusListEntryEntity\n }> {\n const statusList: StatusListEntity = args.statusList ? args.statusList : statusListResultToEntity(await this.getStatusList())\n const statusListEntry = await this.statusListStore.updateStatusListEntry({ ...args, statusListId: statusList.id })\n\n if (this.isStatusList2021Entity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'StatusList2021Entry',\n statusPurpose: statusList.statusPurpose ?? 'revocation',\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n },\n statusListEntry,\n }\n } else if (this.isOAuthStatusListEntity(statusList)) {\n return {\n credentialStatus: {\n id: `${statusList.id}#${statusListEntry.statusListIndex}`,\n type: 'OAuthStatusListEntry',\n bitsPerStatus: statusList.bitsPerStatus,\n statusListIndex: '' + statusListEntry.statusListIndex,\n statusListCredential: statusList.id,\n expiresAt: statusList.expiresAt,\n },\n statusListEntry,\n }\n }\n\n throw new Error(`Unsupported status list type: ${typeof statusList}`)\n }\n\n async getStatusListEntryByCredentialId(args: IGetStatusListEntryByCredentialIdArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByCredentialId(args)\n }\n\n async getStatusListEntryByIndex(args: IGetStatusListEntryByIndexArgs): Promise<IStatusListEntryEntity | undefined> {\n return await this.statusListStore.getStatusListEntryByIndex(args)\n }\n\n async getRandomNewStatusListIndex(args?: { correlationId?: string }): Promise<number> {\n let result = -1\n let tries = 0\n while (result < 0) {\n // no tries guard, because we will throw an error when they are exhausted anyway\n result = await this.getRandomNewStatusListIndexImpl(tries++, args)\n }\n return result\n }\n\n private async getRandomNewStatusListIndexImpl(tries: number, args?: { correlationId?: string }): Promise<number> {\n const statusListId = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n if (tries >= 10) {\n throw Error(`We could not find any random status list index that is available in the statuslist ${statusListId}`)\n }\n // TODO: Check against DB\n const length = await this.getStatusListLength(args)\n const statusListIndex = Array.from({ length: 20 }, () => Math.floor(Math.random() * length))\n const available = await this.statusListStore.availableStatusListEntries({\n statusListId,\n ...(correlationId && { correlationId }),\n statusListIndex,\n })\n if (available.length > 0) {\n return available[0] // doesn't matter we pick the first element, as they are all random anyway\n }\n return -1\n }\n\n async getStatusListLength(args?: { correlationId?: string }): Promise<number> {\n if (!this._statusListLength) {\n this._statusListLength = await this.getStatusList(args).then((details) => details.length)\n }\n return this._statusListLength!\n }\n\n async getStatusList(args?: { correlationId?: string }): Promise<StatusListResult> {\n const id = this.options.id\n const correlationId = args?.correlationId ?? this.options.correlationId\n return await this.statusListStore\n .getStatusList({ id, correlationId })\n .then((statusListEntity: IStatusListEntity) => statusListCredentialToDetails({ statusListCredential: statusListEntity.statusListCredential! }))\n }\n\n async getStatusLists(): Promise<Array<StatusListResult>> {\n const statusLists = await this.statusListStore.getStatusLists({})\n return Promise.all(\n statusLists.map(async (statusListEntity) => {\n return statusListCredentialToDetails({\n statusListCredential: statusListEntity.statusListCredential!,\n })\n }),\n )\n }\n\n isStatusListIndexInUse(): Promise<boolean> {\n return Promise.resolve(false)\n }\n}\n","import { StatusListType } from '@sphereon/ssi-types'\nimport { OAuthStatusListEntity, StatusList2021Entity } from '@sphereon/ssi-sdk.data-store'\nimport { StatusListResult } from '@sphereon/ssi-sdk.vc-status-list'\n\nexport function statusListResultToEntity(result: StatusListResult): StatusList2021Entity | OAuthStatusListEntity {\n const baseFields = {\n id: result.id,\n correlationId: result.correlationId,\n driverType: result.driverType,\n credentialIdMode: result.credentialIdMode,\n length: result.length,\n issuer: result.issuer,\n type: result.type,\n proofFormat: result.proofFormat,\n statusListCredential: result.statusListCredential,\n }\n\n if (result.type === StatusListType.StatusList2021) {\n if (!result.statusList2021) {\n throw new Error('Missing statusList2021 details')\n }\n return Object.assign(new StatusList2021Entity(), {\n ...baseFields,\n indexingDirection: result.statusList2021.indexingDirection,\n statusPurpose: result.statusList2021.statusPurpose,\n })\n } else if (result.type === StatusListType.OAuthStatusList) {\n if (!result.oauthStatusList) {\n throw new Error('Missing oauthStatusList details')\n }\n return Object.assign(new OAuthStatusListEntity(), {\n ...baseFields,\n bitsPerStatus: result.oauthStatusList.bitsPerStatus,\n expiresAt: result.oauthStatusList.expiresAt,\n })\n }\n throw new Error(`Unsupported status list type: ${result.type}`)\n}\n"],"mappings":"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","names":["DataSources","StatusListStore","statusListCredentialToDetails","StatusListCredentialIdMode","StatusListDriverType","StatusListType","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","OAuthStatusListEntity","StatusList2021Entity","getOptions","args","id","correlationId","driverType","StatusListDriverType","AGENT_TYPEORM","driverOptions","dbName","getDriver","dataSource","name","Error","dataSources","DataSources","singleInstance","AgentDataSourceStatusListDriver","init","getDbConnection","_statusListLength","_dataSource","_statusListStore","options","dbArgs","statusListStore","Promise","reject","StatusListStore","getType","createStatusList","credentialIdMode","StatusListCredentialIdMode","ISSUANCE","details","statusListCredentialToDetails","addStatusList","length","updateStatusList","entity","getStatusListRepo","type","findOne","where","deleteStatusList","removeStatusList","resolve","isStatusList2021Entity","statusList","StatusList2021Entity","isOAuthStatusListEntity","OAuthStatusListEntity","updateStatusListEntry","statusListResultToEntity","getStatusList","statusListEntry","statusListId","credentialStatus","statusListIndex","statusPurpose","statusListCredential","bitsPerStatus","expiresAt","getStatusListEntryByCredentialId","getStatusListEntryByIndex","getRandomNewStatusListIndex","result","tries","getRandomNewStatusListIndexImpl","getStatusListLength","Array","from","Math","floor","random","available","availableStatusListEntries","then","statusListEntity","getStatusLists","statusLists","all","map","isStatusListIndexInUse"]}
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.0",
4
+ "version": "0.34.1-next.3+6c49ea2f",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -22,14 +22,14 @@
22
22
  "build": "tsup --config ../../tsup.config.ts --tsconfig ../../tsconfig.tsup.json"
23
23
  },
24
24
  "dependencies": {
25
- "@sphereon/ssi-express-support": "0.34.0",
26
- "@sphereon/ssi-sdk-ext.did-utils": "0.29.0",
27
- "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.0",
28
- "@sphereon/ssi-sdk.agent-config": "0.34.0",
29
- "@sphereon/ssi-sdk.core": "0.34.0",
30
- "@sphereon/ssi-sdk.data-store": "0.34.0",
31
- "@sphereon/ssi-sdk.vc-status-list": "0.34.0",
32
- "@sphereon/ssi-types": "0.34.0",
25
+ "@sphereon/ssi-express-support": "0.34.1-next.3+6c49ea2f",
26
+ "@sphereon/ssi-sdk-ext.did-utils": "0.29.1-next.3",
27
+ "@sphereon/ssi-sdk-ext.identifier-resolution": "0.29.1-next.3",
28
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-next.3+6c49ea2f",
29
+ "@sphereon/ssi-sdk.core": "0.34.1-next.3+6c49ea2f",
30
+ "@sphereon/ssi-sdk.data-store": "0.34.1-next.3+6c49ea2f",
31
+ "@sphereon/ssi-sdk.vc-status-list": "0.34.1-next.3+6c49ea2f",
32
+ "@sphereon/ssi-types": "0.34.1-next.3+6c49ea2f",
33
33
  "@sphereon/vc-status-list": "7.0.0-next.0",
34
34
  "@veramo/core": "4.2.0",
35
35
  "debug": "^4.3.5",
@@ -60,5 +60,5 @@
60
60
  "SSI",
61
61
  "StatusList2021"
62
62
  ],
63
- "gitHead": "b1c9c5e91a9ce4bc677ff2cce5f2d520a16b366d"
63
+ "gitHead": "6c49ea2f9c1bc61641ca2c98e3aa0a5b48018d91"
64
64
  }