diff --git a/packages/anoncreds/src/AnonCredsModule.ts b/packages/anoncreds/src/AnonCredsModule.ts new file mode 100644 index 0000000000..0da6e242f7 --- /dev/null +++ b/packages/anoncreds/src/AnonCredsModule.ts @@ -0,0 +1,23 @@ +import type { AnonCredsModuleConfigOptions } from './AnonCredsModuleConfig' +import type { DependencyManager, Module } from '@aries-framework/core' + +import { AnonCredsModuleConfig } from './AnonCredsModuleConfig' +import { AnonCredsRegistryService } from './services/registry/AnonCredsRegistryService' + +/** + * @public + */ +export class AnonCredsModule implements Module { + public readonly config: AnonCredsModuleConfig + + public constructor(config: AnonCredsModuleConfigOptions) { + this.config = new AnonCredsModuleConfig(config) + } + + public register(dependencyManager: DependencyManager) { + // Config + dependencyManager.registerInstance(AnonCredsModuleConfig, this.config) + + dependencyManager.registerSingleton(AnonCredsRegistryService) + } +} diff --git a/packages/anoncreds/src/AnonCredsModuleConfig.ts b/packages/anoncreds/src/AnonCredsModuleConfig.ts new file mode 100644 index 0000000000..9f7b971aab --- /dev/null +++ b/packages/anoncreds/src/AnonCredsModuleConfig.ts @@ -0,0 +1,28 @@ +import type { AnonCredsRegistry } from './services' + +/** + * @public + * AnonCredsModuleConfigOptions defines the interface for the options of the AnonCredsModuleConfig class. + */ +export interface AnonCredsModuleConfigOptions { + /** + * A list of AnonCreds registries to make available to the AnonCreds module. + */ + registries: [AnonCredsRegistry, ...AnonCredsRegistry[]] +} + +/** + * @public + */ +export class AnonCredsModuleConfig { + private options: AnonCredsModuleConfigOptions + + public constructor(options: AnonCredsModuleConfigOptions) { + this.options = options + } + + /** See {@link AnonCredsModuleConfigOptions.registries} */ + public get registries() { + return this.options.registries + } +} diff --git a/packages/anoncreds/src/__tests__/AnonCredsModule.test.ts b/packages/anoncreds/src/__tests__/AnonCredsModule.test.ts new file mode 100644 index 0000000000..90aa51ce66 --- /dev/null +++ b/packages/anoncreds/src/__tests__/AnonCredsModule.test.ts @@ -0,0 +1,28 @@ +import type { AnonCredsRegistry } from '../services' +import type { DependencyManager } from '@aries-framework/core' + +import { AnonCredsModule } from '../AnonCredsModule' +import { AnonCredsModuleConfig } from '../AnonCredsModuleConfig' +import { AnonCredsRegistryService } from '../services/registry/AnonCredsRegistryService' + +const dependencyManager = { + registerInstance: jest.fn(), + registerSingleton: jest.fn(), +} as unknown as DependencyManager + +const registry = {} as AnonCredsRegistry + +describe('AnonCredsModule', () => { + test('registers dependencies on the dependency manager', () => { + const anonCredsModule = new AnonCredsModule({ + registries: [registry], + }) + anonCredsModule.register(dependencyManager) + + expect(dependencyManager.registerSingleton).toHaveBeenCalledTimes(1) + expect(dependencyManager.registerSingleton).toHaveBeenCalledWith(AnonCredsRegistryService) + + expect(dependencyManager.registerInstance).toHaveBeenCalledTimes(1) + expect(dependencyManager.registerInstance).toHaveBeenCalledWith(AnonCredsModuleConfig, anonCredsModule.config) + }) +}) diff --git a/packages/anoncreds/src/__tests__/AnonCredsModuleConfig.test.ts b/packages/anoncreds/src/__tests__/AnonCredsModuleConfig.test.ts new file mode 100644 index 0000000000..beaca8bf53 --- /dev/null +++ b/packages/anoncreds/src/__tests__/AnonCredsModuleConfig.test.ts @@ -0,0 +1,15 @@ +import type { AnonCredsRegistry } from '../services' + +import { AnonCredsModuleConfig } from '../AnonCredsModuleConfig' + +describe('AnonCredsModuleConfig', () => { + test('sets values', () => { + const registry = {} as AnonCredsRegistry + + const config = new AnonCredsModuleConfig({ + registries: [registry], + }) + + expect(config.registries).toEqual([registry]) + }) +}) diff --git a/packages/anoncreds/src/error/AnonCredsError.ts b/packages/anoncreds/src/error/AnonCredsError.ts new file mode 100644 index 0000000000..eb6d250a4a --- /dev/null +++ b/packages/anoncreds/src/error/AnonCredsError.ts @@ -0,0 +1,7 @@ +import { AriesFrameworkError } from '@aries-framework/core' + +export class AnonCredsError extends AriesFrameworkError { + public constructor(message: string, { cause }: { cause?: Error } = {}) { + super(message, { cause }) + } +} diff --git a/packages/anoncreds/src/error/index.ts b/packages/anoncreds/src/error/index.ts new file mode 100644 index 0000000000..d9786950bf --- /dev/null +++ b/packages/anoncreds/src/error/index.ts @@ -0,0 +1 @@ +export * from './AnonCredsError' diff --git a/packages/anoncreds/src/index.ts b/packages/anoncreds/src/index.ts index 83fdeb7877..759e343c2c 100644 --- a/packages/anoncreds/src/index.ts +++ b/packages/anoncreds/src/index.ts @@ -1,2 +1,5 @@ export * from './models' export * from './services' +export * from './error' +export { AnonCredsModule } from './AnonCredsModule' +export { AnonCredsModuleConfig, AnonCredsModuleConfigOptions } from './AnonCredsModuleConfig' diff --git a/packages/anoncreds/src/services/registry/AnonCredsRegistry.ts b/packages/anoncreds/src/services/registry/AnonCredsRegistry.ts index 966a1afb95..e3061043dd 100644 --- a/packages/anoncreds/src/services/registry/AnonCredsRegistry.ts +++ b/packages/anoncreds/src/services/registry/AnonCredsRegistry.ts @@ -8,8 +8,12 @@ import type { GetRevocationRegistryDefinitionReturn } from './RevocationRegistry import type { GetSchemaReturn, RegisterSchemaOptions, RegisterSchemaReturn } from './SchemaOptions' import type { AgentContext } from '@aries-framework/core' -// This service can be registered multiple times in a single AFJ instance. +/** + * @public + */ export interface AnonCredsRegistry { + supportedIdentifier: RegExp + getSchema(agentContext: AgentContext, schemaId: string): Promise registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise diff --git a/packages/anoncreds/src/services/registry/AnonCredsRegistryService.ts b/packages/anoncreds/src/services/registry/AnonCredsRegistryService.ts new file mode 100644 index 0000000000..8ee8eb4b50 --- /dev/null +++ b/packages/anoncreds/src/services/registry/AnonCredsRegistryService.ts @@ -0,0 +1,28 @@ +import type { AnonCredsRegistry } from '.' +import type { AgentContext } from '@aries-framework/core' + +import { injectable } from '@aries-framework/core' + +import { AnonCredsModuleConfig } from '../../AnonCredsModuleConfig' +import { AnonCredsError } from '../../error' + +/** + * @internal + * The AnonCreds registry service manages multiple {@link AnonCredsRegistry} instances + * and returns the correct registry based on a given identifier + */ +@injectable() +export class AnonCredsRegistryService { + public async getRegistryForIdentifier(agentContext: AgentContext, identifier: string): Promise { + const registries = agentContext.dependencyManager.resolve(AnonCredsModuleConfig).registries + + // TODO: should we check if multiple are registered? + const registry = registries.find((registry) => registry.supportedIdentifier.test(identifier)) + + if (!registry) { + throw new AnonCredsError(`No AnonCredsRegistry registered for identifier '${registry}'`) + } + + return registry + } +} diff --git a/packages/anoncreds/src/services/registry/__tests__/AnonCredsRegistryService.test.ts b/packages/anoncreds/src/services/registry/__tests__/AnonCredsRegistryService.test.ts new file mode 100644 index 0000000000..096626f805 --- /dev/null +++ b/packages/anoncreds/src/services/registry/__tests__/AnonCredsRegistryService.test.ts @@ -0,0 +1,38 @@ +import type { AnonCredsRegistry } from '../AnonCredsRegistry' + +import { getAgentContext } from '../../../../../core/tests/helpers' +import { AnonCredsModuleConfig } from '../../../AnonCredsModuleConfig' +import { AnonCredsError } from '../../../error' +import { AnonCredsRegistryService } from '../AnonCredsRegistryService' + +const registryOne = { + supportedIdentifier: /a/, +} as AnonCredsRegistry + +const registryTwo = { + supportedIdentifier: /b/, +} as AnonCredsRegistry + +const agentContext = getAgentContext({ + registerInstances: [ + [ + AnonCredsModuleConfig, + new AnonCredsModuleConfig({ + registries: [registryOne, registryTwo], + }), + ], + ], +}) + +const anonCredsRegistryService = new AnonCredsRegistryService() + +describe('AnonCredsRegistryService', () => { + test('returns the registry for an identifier based on the supportedMethods regex', async () => { + await expect(anonCredsRegistryService.getRegistryForIdentifier(agentContext, 'a')).resolves.toEqual(registryOne) + await expect(anonCredsRegistryService.getRegistryForIdentifier(agentContext, 'b')).resolves.toEqual(registryTwo) + }) + + test('throws AnonCredsError if no registry is found for the given identifier', async () => { + await expect(anonCredsRegistryService.getRegistryForIdentifier(agentContext, 'c')).rejects.toThrow(AnonCredsError) + }) +}) diff --git a/packages/indy-sdk/src/IndySdkModuleConfig.ts b/packages/indy-sdk/src/IndySdkModuleConfig.ts index a01bf813b3..e5b16142ee 100644 --- a/packages/indy-sdk/src/IndySdkModuleConfig.ts +++ b/packages/indy-sdk/src/IndySdkModuleConfig.ts @@ -38,7 +38,7 @@ export class IndySdkModuleConfig { this.options = options } - /** See {@link IndySdkModuleConfigOptions.resolvers} */ + /** See {@link IndySdkModuleConfigOptions.indySdk} */ public get indySdk() { return this.options.indySdk } diff --git a/packages/indy-sdk/src/anoncreds/services/IndySdkAnonCredsRegistry.ts b/packages/indy-sdk/src/anoncreds/services/IndySdkAnonCredsRegistry.ts index 3b5c6a08ce..95b08fa88b 100644 --- a/packages/indy-sdk/src/anoncreds/services/IndySdkAnonCredsRegistry.ts +++ b/packages/indy-sdk/src/anoncreds/services/IndySdkAnonCredsRegistry.ts @@ -1,3 +1,4 @@ +import type { IndySdk } from '../../types' import type { AnonCredsRegistry, GetCredentialDefinitionReturn, @@ -12,17 +13,16 @@ import type { import type { AgentContext } from '@aries-framework/core' import type { Schema as IndySdkSchema } from 'indy-sdk' -import { inject } from '@aries-framework/core' - import { IndySdkError, isIndyError } from '../../error' import { IndySdkPoolService } from '../../ledger' -import { IndySdk, IndySdkSymbol } from '../../types' +import { IndySdkSymbol } from '../../types' import { didFromCredentialDefinitionId, didFromRevocationRegistryDefinitionId, didFromSchemaId, getLegacyCredentialDefinitionId, getLegacySchemaId, + indySdkAnonCredsRegistryIdentifierRegex, } from '../utils/identifiers' import { anonCredsRevocationListFromIndySdk, @@ -33,32 +33,34 @@ import { * TODO: validation of the identifiers. The Indy SDK classes only support the legacy (unqualified) identifiers. */ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { - private indySdk: IndySdk - private indySdkPoolService: IndySdkPoolService - - public constructor(@inject(IndySdkSymbol) indySdk: IndySdk, indySdkPoolService: IndySdkPoolService) { - this.indySdk = indySdk - this.indySdkPoolService = indySdkPoolService - } + /** + * This class only supports resolving and registering objects with legacy indy identifiers. + * It needs to include support for the schema, credential definition, revocation registry as well + * as the issuer id (which is needed when registering objects). + */ + public readonly supportedIdentifier = indySdkAnonCredsRegistryIdentifierRegex public async getSchema(agentContext: AgentContext, schemaId: string): Promise { try { + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + const did = didFromSchemaId(schemaId) - const { pool } = await this.indySdkPoolService.getPoolForDid(agentContext, did) + const { pool } = await indySdkPoolService.getPoolForDid(agentContext, did) agentContext.config.logger.debug(`Getting schema '${schemaId}' from ledger '${pool.didIndyNamespace}'`) - const request = await this.indySdk.buildGetSchemaRequest(null, schemaId) + const request = await indySdk.buildGetSchemaRequest(null, schemaId) agentContext.config.logger.trace( `Submitting get schema request for schema '${schemaId}' to ledger '${pool.didIndyNamespace}'` ) - const response = await this.indySdkPoolService.submitReadRequest(pool, request) + const response = await indySdkPoolService.submitReadRequest(pool, request) agentContext.config.logger.trace(`Got un-parsed schema '${schemaId}' from ledger '${pool.didIndyNamespace}'`, { response, }) - const [, schema] = await this.indySdk.parseGetSchemaResponse(response) + const [, schema] = await indySdk.parseGetSchemaResponse(response) agentContext.config.logger.debug(`Got schema '${schemaId}' from ledger '${pool.didIndyNamespace}'`, { schema, }) @@ -117,7 +119,10 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { } try { - const pool = this.indySdkPoolService.getPoolForNamespace(options.options.didIndyNamespace) + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + + const pool = indySdkPoolService.getPoolForNamespace(options.options.didIndyNamespace) agentContext.config.logger.debug( `Register schema on ledger '${pool.didIndyNamespace}' with did '${options.schema.issuerId}'`, options.schema @@ -133,14 +138,9 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { // buildSchemaRequest (seqNo is not yet known) } as IndySdkSchema - const request = await this.indySdk.buildSchemaRequest(options.schema.issuerId, schema) + const request = await indySdk.buildSchemaRequest(options.schema.issuerId, schema) - const response = await this.indySdkPoolService.submitWriteRequest( - agentContext, - pool, - request, - options.schema.issuerId - ) + const response = await indySdkPoolService.submitWriteRequest(agentContext, pool, request, options.schema.issuerId) agentContext.config.logger.debug(`Registered schema '${schema.id}' on ledger '${pool.didIndyNamespace}'`, { response, schema, @@ -189,19 +189,22 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + const did = didFromCredentialDefinitionId(credentialDefinitionId) - const { pool } = await this.indySdkPoolService.getPoolForDid(agentContext, did) + const { pool } = await indySdkPoolService.getPoolForDid(agentContext, did) agentContext.config.logger.debug( `Using ledger '${pool.didIndyNamespace}' to retrieve credential definition '${credentialDefinitionId}'` ) - const request = await this.indySdk.buildGetCredDefRequest(null, credentialDefinitionId) + const request = await indySdk.buildGetCredDefRequest(null, credentialDefinitionId) agentContext.config.logger.trace( `Submitting get credential definition request for credential definition '${credentialDefinitionId}' to ledger '${pool.didIndyNamespace}'` ) - const response = await this.indySdkPoolService.submitReadRequest(pool, request) + const response = await indySdkPoolService.submitReadRequest(pool, request) agentContext.config.logger.trace( `Got un-parsed credential definition '${credentialDefinitionId}' from ledger '${pool.didIndyNamespace}'`, { @@ -209,7 +212,7 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { } ) - const [, credentialDefinition] = await this.indySdk.parseGetCredDefResponse(response) + const [, credentialDefinition] = await indySdk.parseGetCredDefResponse(response) agentContext.config.logger.debug( `Got credential definition '${credentialDefinitionId}' from ledger '${pool.didIndyNamespace}'`, { @@ -267,7 +270,10 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { } try { - const pool = this.indySdkPoolService.getPoolForNamespace(options.options.didIndyNamespace) + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + + const pool = indySdkPoolService.getPoolForNamespace(options.options.didIndyNamespace) agentContext.config.logger.debug( `Registering credential definition on ledger '${pool.didIndyNamespace}' with did '${options.credentialDefinition.issuerId}'`, options.credentialDefinition @@ -296,7 +302,7 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { options.credentialDefinition.tag ) - const request = await this.indySdk.buildCredDefRequest(options.credentialDefinition.issuerId, { + const request = await indySdk.buildCredDefRequest(options.credentialDefinition.issuerId, { id: credentialDefinitionId, schemaId: options.credentialDefinition.schemaId, tag: options.credentialDefinition.tag, @@ -305,7 +311,7 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { ver: '1.0', }) - const response = await this.indySdkPoolService.submitWriteRequest( + const response = await indySdkPoolService.submitWriteRequest( agentContext, pool, request, @@ -350,18 +356,21 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinitionId: string ): Promise { try { + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + const did = didFromRevocationRegistryDefinitionId(revocationRegistryDefinitionId) - const { pool } = await this.indySdkPoolService.getPoolForDid(agentContext, did) + const { pool } = await indySdkPoolService.getPoolForDid(agentContext, did) agentContext.config.logger.debug( `Using ledger '${pool.didIndyNamespace}' to retrieve revocation registry definition '${revocationRegistryDefinitionId}'` ) - const request = await this.indySdk.buildGetRevocRegDefRequest(null, revocationRegistryDefinitionId) + const request = await indySdk.buildGetRevocRegDefRequest(null, revocationRegistryDefinitionId) agentContext.config.logger.trace( `Submitting get revocation registry definition request for revocation registry definition '${revocationRegistryDefinitionId}' to ledger` ) - const response = await this.indySdkPoolService.submitReadRequest(pool, request) + const response = await indySdkPoolService.submitReadRequest(pool, request) agentContext.config.logger.trace( `Got un-parsed revocation registry definition '${revocationRegistryDefinitionId}' from ledger '${pool.didIndyNamespace}'`, { @@ -369,7 +378,7 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { } ) - const [, revocationRegistryDefinition] = await this.indySdk.parseGetRevocRegDefResponse(response) + const [, revocationRegistryDefinition] = await indySdk.parseGetRevocRegDefResponse(response) agentContext.config.logger.debug( `Got revocation registry definition '${revocationRegistryDefinitionId}' from ledger`, @@ -415,21 +424,24 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { timestamp: number ): Promise { try { + const indySdkPoolService = agentContext.dependencyManager.resolve(IndySdkPoolService) + const indySdk = agentContext.dependencyManager.resolve(IndySdkSymbol) + const did = didFromRevocationRegistryDefinitionId(revocationRegistryId) - const { pool } = await this.indySdkPoolService.getPoolForDid(agentContext, did) + const { pool } = await indySdkPoolService.getPoolForDid(agentContext, did) agentContext.config.logger.debug( `Using ledger '${pool.id}' to retrieve revocation registry deltas with revocation registry definition id '${revocationRegistryId}' until ${timestamp}` ) // TODO: implement caching for returned deltas - const request = await this.indySdk.buildGetRevocRegDeltaRequest(null, revocationRegistryId, 0, timestamp) + const request = await indySdk.buildGetRevocRegDeltaRequest(null, revocationRegistryId, 0, timestamp) agentContext.config.logger.trace( `Submitting get revocation registry delta request for revocation registry '${revocationRegistryId}' to ledger` ) - const response = await this.indySdkPoolService.submitReadRequest(pool, request) + const response = await indySdkPoolService.submitReadRequest(pool, request) agentContext.config.logger.trace( `Got revocation registry delta unparsed-response '${revocationRegistryId}' from ledger`, { @@ -437,7 +449,7 @@ export class IndySdkAnonCredsRegistry implements AnonCredsRegistry { } ) - const [, revocationRegistryDelta, deltaTimestamp] = await this.indySdk.parseGetRevocRegDeltaResponse(response) + const [, revocationRegistryDelta, deltaTimestamp] = await indySdk.parseGetRevocRegDeltaResponse(response) agentContext.config.logger.debug( `Got revocation registry deltas '${revocationRegistryId}' until timestamp ${timestamp} from ledger`, diff --git a/packages/indy-sdk/src/anoncreds/services/IndySdkHolderService.ts b/packages/indy-sdk/src/anoncreds/services/IndySdkHolderService.ts index 88179381a9..49b619332d 100644 --- a/packages/indy-sdk/src/anoncreds/services/IndySdkHolderService.ts +++ b/packages/indy-sdk/src/anoncreds/services/IndySdkHolderService.ts @@ -13,7 +13,6 @@ import type { } from '@aries-framework/anoncreds' import type { AgentContext } from '@aries-framework/core' import type { - Cred, CredentialDefs, IndyRequestedCredentials, RevStates, diff --git a/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts b/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts index f85ec160b5..76454b615a 100644 --- a/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts +++ b/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts @@ -5,9 +5,26 @@ import { getIndySeqNoFromUnqualifiedCredentialDefinitionId, getLegacyCredentialDefinitionId, getLegacySchemaId, + indySdkAnonCredsRegistryIdentifierRegex, } from '../identifiers' describe('identifiers', () => { + it('matches against a legacy indy did, schema id, credential definition id and revocation registry id', () => { + const did = '7Tqg6BwSSWapxgUDm9KKgg' + const schemaId = 'BQ42WeE24jFHeyGg8x9XAz:2:Medical Bill:1.0' + const credentialDefinitionId = 'N7baRMcyvPwWc8v85CtZ6e:3:CL:100669:SCH Employee ID' + const revocationRegistryId = + 'N7baRMcyvPwWc8v85CtZ6e:4:N7baRMcyvPwWc8v85CtZ6e:3:CL:100669:SCH Employee ID:CL_ACCUM:1-1024' + + const anotherId = 'some:id' + + expect(indySdkAnonCredsRegistryIdentifierRegex.test(did)).toEqual(true) + expect(indySdkAnonCredsRegistryIdentifierRegex.test(schemaId)).toEqual(true) + expect(indySdkAnonCredsRegistryIdentifierRegex.test(credentialDefinitionId)).toEqual(true) + expect(indySdkAnonCredsRegistryIdentifierRegex.test(revocationRegistryId)).toEqual(true) + expect(indySdkAnonCredsRegistryIdentifierRegex.test(anotherId)).toEqual(false) + }) + it('getLegacySchemaId should return a valid schema id given a did, name, and version', () => { const did = '12345' const name = 'backbench' diff --git a/packages/indy-sdk/src/anoncreds/utils/identifiers.ts b/packages/indy-sdk/src/anoncreds/utils/identifiers.ts index bc59b5f8d4..62d2650602 100644 --- a/packages/indy-sdk/src/anoncreds/utils/identifiers.ts +++ b/packages/indy-sdk/src/anoncreds/utils/identifiers.ts @@ -1,3 +1,14 @@ +export const legacyIndyIssuerIdRegex = /^[a-zA-Z0-9]{21,22}$/ +export const legacyIndySchemaIdRegex = /^[a-zA-Z0-9]{21,22}:2:.+:[0-9.]+$/ +export const legacyIndyCredentialDefinitionIdRegex = + /^[a-zA-Z0-9]{21,22}:3:CL:(([1-9][0-9]*)|([a-zA-Z0-9]{21,22}:2:.+:[0-9.]+)):(.+)?$/ +export const legacyIndyRevocationRegistryIdRegex = + /^[a-zA-Z0-9]{21,22}:4:[a-zA-Z0-9]{21,22}:3:CL:(([1-9][0-9]*)|([a-zA-Z0-9]{21,22}:2:.+:[0-9.]+))(:.+)?:CL_ACCUM:(.+$)/ + +export const indySdkAnonCredsRegistryIdentifierRegex = new RegExp( + `${legacyIndyIssuerIdRegex.source}|${legacyIndySchemaIdRegex.source}|${legacyIndyCredentialDefinitionIdRegex.source}|${legacyIndyRevocationRegistryIdRegex.source}` +) + export function getIndySeqNoFromUnqualifiedCredentialDefinitionId(unqualifiedCredentialDefinitionId: string): number { // 5nDyJVP1NrcPAttP3xwMB9:3:CL:56495:npbd const [, , , seqNo] = unqualifiedCredentialDefinitionId.split(':')