@cheqd/studio 3.15.0-develop.1 → 3.15.0-develop.2

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.
Files changed (130) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +3 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/controllers/api/accreditation.d.ts.map +1 -1
  5. package/dist/controllers/api/accreditation.js +36 -9
  6. package/dist/controllers/api/accreditation.js.map +1 -1
  7. package/dist/controllers/api/credential-status.d.ts +94 -0
  8. package/dist/controllers/api/credential-status.d.ts.map +1 -1
  9. package/dist/controllers/api/credential-status.js +220 -506
  10. package/dist/controllers/api/credential-status.js.map +1 -1
  11. package/dist/controllers/api/credential.d.ts +66 -0
  12. package/dist/controllers/api/credential.d.ts.map +1 -1
  13. package/dist/controllers/api/credential.js +117 -1
  14. package/dist/controllers/api/credential.js.map +1 -1
  15. package/dist/controllers/api/did.js.map +1 -1
  16. package/dist/controllers/api/key.js.map +1 -1
  17. package/dist/controllers/api/presentation.js +22 -21
  18. package/dist/controllers/api/presentation.js.map +1 -1
  19. package/dist/controllers/api/providers.controller.js.map +1 -1
  20. package/dist/controllers/api/resource.js.map +1 -1
  21. package/dist/database/entities/issued-credential.entity.d.ts +10 -1
  22. package/dist/database/entities/issued-credential.entity.d.ts.map +1 -1
  23. package/dist/database/entities/issued-credential.entity.js +22 -0
  24. package/dist/database/entities/issued-credential.entity.js.map +1 -1
  25. package/dist/database/entities/status-registry.entity.d.ts +60 -0
  26. package/dist/database/entities/status-registry.entity.d.ts.map +1 -0
  27. package/dist/database/entities/status-registry.entity.js +145 -0
  28. package/dist/database/entities/status-registry.entity.js.map +1 -0
  29. package/dist/database/migrations/1761834657128-studio-migrations.d.ts +7 -0
  30. package/dist/database/migrations/1761834657128-studio-migrations.d.ts.map +1 -0
  31. package/dist/database/migrations/1761834657128-studio-migrations.js +14 -0
  32. package/dist/database/migrations/1761834657128-studio-migrations.js.map +1 -0
  33. package/dist/database/migrations/1762775396083-MigrateStatusLists.d.ts +25 -0
  34. package/dist/database/migrations/1762775396083-MigrateStatusLists.d.ts.map +1 -0
  35. package/dist/database/migrations/1762775396083-MigrateStatusLists.js +243 -0
  36. package/dist/database/migrations/1762775396083-MigrateStatusLists.js.map +1 -0
  37. package/dist/database/migrations/1762775500000-UpdateWriteCursors.d.ts +23 -0
  38. package/dist/database/migrations/1762775500000-UpdateWriteCursors.d.ts.map +1 -0
  39. package/dist/database/migrations/1762775500000-UpdateWriteCursors.js +181 -0
  40. package/dist/database/migrations/1762775500000-UpdateWriteCursors.js.map +1 -0
  41. package/dist/database/types/types.d.ts.map +1 -1
  42. package/dist/database/types/types.js +10 -0
  43. package/dist/database/types/types.js.map +1 -1
  44. package/dist/helpers/mailchimp.d.ts.map +1 -1
  45. package/dist/helpers/mailchimp.js +1 -3
  46. package/dist/helpers/mailchimp.js.map +1 -1
  47. package/dist/middleware/auth/routes/api/credential-status-auth.d.ts.map +1 -1
  48. package/dist/middleware/auth/routes/api/credential-status-auth.js +2 -0
  49. package/dist/middleware/auth/routes/api/credential-status-auth.js.map +1 -1
  50. package/dist/services/api/credential-status.d.ts +107 -0
  51. package/dist/services/api/credential-status.d.ts.map +1 -0
  52. package/dist/services/api/credential-status.js +923 -0
  53. package/dist/services/api/credential-status.js.map +1 -0
  54. package/dist/services/api/credentials.d.ts +12 -0
  55. package/dist/services/api/credentials.d.ts.map +1 -1
  56. package/dist/services/api/credentials.js +330 -117
  57. package/dist/services/api/credentials.js.map +1 -1
  58. package/dist/services/connectors/resource.js.map +1 -1
  59. package/dist/services/identity/abstract.d.ts +1 -1
  60. package/dist/services/identity/abstract.d.ts.map +1 -1
  61. package/dist/services/identity/abstract.js +1 -1
  62. package/dist/services/identity/abstract.js.map +1 -1
  63. package/dist/services/identity/default.d.ts +1 -1
  64. package/dist/services/identity/default.d.ts.map +1 -1
  65. package/dist/services/identity/default.js +2 -2
  66. package/dist/services/identity/default.js.map +1 -1
  67. package/dist/services/identity/index.d.ts +1 -1
  68. package/dist/services/identity/index.d.ts.map +1 -1
  69. package/dist/services/identity/providers/studio/agent.d.ts +6 -6
  70. package/dist/services/identity/providers/studio/agent.d.ts.map +1 -1
  71. package/dist/services/identity/providers/studio/agent.js +11 -2
  72. package/dist/services/identity/providers/studio/agent.js.map +1 -1
  73. package/dist/services/identity/providers/studio/local.d.ts +3 -3
  74. package/dist/services/identity/providers/studio/postgres.d.ts +3 -3
  75. package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -1
  76. package/dist/services/identity/providers/studio/postgres.js +0 -12
  77. package/dist/services/identity/providers/studio/postgres.js.map +1 -1
  78. package/dist/services/track/api/credential-status-subscriber.d.ts +4 -4
  79. package/dist/services/track/api/credential-status-subscriber.d.ts.map +1 -1
  80. package/dist/services/track/api/credential-status-subscriber.js +18 -1
  81. package/dist/services/track/api/credential-status-subscriber.js.map +1 -1
  82. package/dist/services/track/api/credential-subscriber.d.ts +4 -4
  83. package/dist/services/track/api/credential-subscriber.d.ts.map +1 -1
  84. package/dist/services/track/api/credential-subscriber.js.map +1 -1
  85. package/dist/services/track/api/did-subscriber.d.ts +4 -4
  86. package/dist/services/track/api/did-subscriber.d.ts.map +1 -1
  87. package/dist/services/track/api/did-subscriber.js.map +1 -1
  88. package/dist/services/track/api/key-subscriber.d.ts +4 -4
  89. package/dist/services/track/api/key-subscriber.d.ts.map +1 -1
  90. package/dist/services/track/api/key-subscriber.js.map +1 -1
  91. package/dist/services/track/api/presentation-subscriber.d.ts +4 -4
  92. package/dist/services/track/api/presentation-subscriber.d.ts.map +1 -1
  93. package/dist/services/track/api/presentation-subscriber.js.map +1 -1
  94. package/dist/services/track/api/resource-subscriber.d.ts +4 -4
  95. package/dist/services/track/api/resource-subscriber.d.ts.map +1 -1
  96. package/dist/services/track/api/resource-subscriber.js.map +1 -1
  97. package/dist/services/track/base.d.ts +2 -2
  98. package/dist/services/track/base.d.ts.map +1 -1
  99. package/dist/services/track/base.js.map +1 -1
  100. package/dist/services/track/operation-subscriber.d.ts +4 -4
  101. package/dist/services/track/operation-subscriber.d.ts.map +1 -1
  102. package/dist/services/track/operation-subscriber.js.map +1 -1
  103. package/dist/services/track/tracker.d.ts +2 -2
  104. package/dist/services/track/tracker.d.ts.map +1 -1
  105. package/dist/services/track/tracker.js.map +1 -1
  106. package/dist/services/track/types.d.ts +2 -2
  107. package/dist/services/track/types.d.ts.map +1 -1
  108. package/dist/static/swagger-api.json +560 -46
  109. package/dist/types/accreditation.d.ts +3 -0
  110. package/dist/types/accreditation.d.ts.map +1 -1
  111. package/dist/types/constants.d.ts +2 -0
  112. package/dist/types/constants.d.ts.map +1 -1
  113. package/dist/types/constants.js +2 -0
  114. package/dist/types/constants.js.map +1 -1
  115. package/dist/types/credential-status.d.ts +39 -1
  116. package/dist/types/credential-status.d.ts.map +1 -1
  117. package/dist/types/credential-status.js +7 -0
  118. package/dist/types/credential-status.js.map +1 -1
  119. package/dist/types/credential.d.ts +21 -3
  120. package/dist/types/credential.d.ts.map +1 -1
  121. package/dist/types/credential.js +5 -0
  122. package/dist/types/credential.js.map +1 -1
  123. package/dist/types/swagger-api-types.d.ts +242 -39
  124. package/dist/types/swagger-api-types.d.ts.map +1 -1
  125. package/dist/types/swagger-api-types.js +242 -39
  126. package/dist/types/swagger-api-types.js.map +1 -1
  127. package/dist/types/track.d.ts +8 -6
  128. package/dist/types/track.d.ts.map +1 -1
  129. package/dist/types/track.js.map +1 -1
  130. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status.js","sourceRoot":"","sources":["../../../src/services/api/credential-status.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,19 @@ import { GetIssuedCredentialOptions, IssuedCredentialCreateOptions, IssuedCreden
3
3
  import type { CustomerEntity } from '../../database/entities/customer.entity.js';
4
4
  import { IssuedCredentialEntity } from '../../database/entities/issued-credential.entity.js';
5
5
  import { Repository } from 'typeorm';
6
+ import { StatusRegistryEntity } from '../../database/entities/status-registry.entity.js';
6
7
  export declare class Credentials {
7
8
  static instance: Credentials;
8
9
  repository: Repository<IssuedCredentialEntity>;
10
+ statusRegistryRepository: Repository<StatusRegistryEntity>;
9
11
  constructor();
10
12
  issue_credential(request: CredentialRequest, customer: CustomerEntity): Promise<VerifiableCredential>;
13
+ /**
14
+ * Phase 1: Atomic Index Reservation with CAS
15
+ * Reserves a unique index using Compare-And-Swap pattern
16
+ * Implements lock-free allocation with exponential backoff retry
17
+ */
18
+ private reserveStatusIndex;
11
19
  /**
12
20
  * List issued credentials with pagination and filtering
13
21
  */
@@ -31,6 +39,10 @@ export declare class Credentials {
31
39
  * Update credential metadata
32
40
  */
33
41
  update(issuedCredentialId: string, updateData: Partial<Pick<IssuedCredentialEntity, 'providerCredentialId' | 'status' | 'metadata'>>, customer: CustomerEntity): Promise<IssuedCredentialResponse | null>;
42
+ /**
43
+ * Fetch a single issued credential record by ID
44
+ */
45
+ fetch(id: string, customer: CustomerEntity): Promise<IssuedCredentialEntity | null>;
34
46
  /**
35
47
  * Convert entity to API response format
36
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/services/api/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAEN,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAIjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAqC,UAAU,EAAE,MAAM,SAAS,CAAC;AAUxE,qBAAa,WAAW;IACvB,OAAc,QAAQ,cAAqB;IACpC,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;;IAMhD,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwK3G;;OAEG;IACG,IAAI,CACT,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,4BAAiC,GACxC,OAAO,CAAC;QAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BtE;;OAEG;IACG,GAAG,CACR,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAiE3C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAqB/G;;OAEG;IACG,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1G;;OAEG;IACG,MAAM,CACX,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,EACjG,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IA+C3C;;OAEG;IACH,OAAO,CAAC,UAAU;IAqClB;;OAEG;YACW,sBAAsB;IA2EpC;;OAEG;YACW,2BAA2B;CAmCzC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/services/api/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAGN,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAIjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAkBzF,qBAAa,WAAW;IACvB,OAAc,QAAQ,cAAqB;IACpC,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/C,wBAAwB,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC;;IAO5D,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiO3G;;;;OAIG;YACW,kBAAkB;IA6IhC;;OAEG;IACG,IAAI,CACT,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,4BAAiC,GACxC,OAAO,CAAC;QAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA4DtE;;OAEG;IACG,GAAG,CACR,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAiE3C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmC/G;;OAEG;IACG,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1G;;OAEG;IACG,MAAM,CACX,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,EACjG,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAgD3C;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAkBzF;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;YACW,sBAAsB;IA2EpC;;OAEG;YACW,2BAA2B;CAmCzC"}
@@ -1,5 +1,5 @@
1
- import { VC_CONTEXT, VC_TYPE } from '../../types/constants.js';
2
- import { CredentialConnectors, } from '../../types/credential.js';
1
+ import { OperationCategoryNameEnum, OperationNameEnum, VC_CONTEXT, VC_TYPE } from '../../types/constants.js';
2
+ import { CredentialCategory, CredentialConnectors, } from '../../types/credential.js';
3
3
  import { IdentityServiceStrategySetup } from '../identity/index.js';
4
4
  import { v4 } from 'uuid';
5
5
  import * as dotenv from 'dotenv';
@@ -7,20 +7,24 @@ import { VeridaDIDValidator } from '../../controllers/validator/did.js';
7
7
  import { ResourceConnector } from '../connectors/resource.js';
8
8
  import { DockIdentityService } from '../identity/providers/index.js';
9
9
  import { IssuedCredentialEntity } from '../../database/entities/issued-credential.entity.js';
10
- import { LessThanOrEqual } from 'typeorm';
11
10
  import { Connection } from '../../database/connection/connection.js';
11
+ import { StatusRegistryEntity } from '../../database/entities/status-registry.entity.js';
12
+ import { StatusListType, StatusRegistryState, } from '../../types/credential-status.js';
12
13
  import { validate as uuidValidate } from 'uuid';
13
- import { DefaultStatusList2021StatusPurposeTypes } from '@cheqd/did-provider-cheqd';
14
+ import { BitstringStatusListResourceType, DefaultStatusList2021StatusPurposeTypes } from '@cheqd/did-provider-cheqd';
15
+ import { eventTracker } from '../track/tracker.js';
14
16
  dotenv.config();
15
17
  const { ENABLE_VERIDA_CONNECTOR } = process.env;
16
18
  export class Credentials {
17
19
  static instance = new Credentials();
18
20
  repository;
21
+ statusRegistryRepository;
19
22
  constructor() {
20
23
  this.repository = Connection.instance.dbConnection.getRepository(IssuedCredentialEntity);
24
+ this.statusRegistryRepository = Connection.instance.dbConnection.getRepository(StatusRegistryEntity);
21
25
  }
22
26
  async issue_credential(request, customer) {
23
- const { attributes, credentialName, credentialSummary, credentialSchema, issuerDid, subjectDid, type, expirationDate, credentialStatus, '@context': context, format, connector, credentialId, providerId, category, ...additionalData } = request;
27
+ const { attributes, credentialName, credentialSummary, credentialSchema, issuerDid, subjectDid, type, expirationDate, credentialStatus, '@context': context, format, connector, credentialId, providerId, category, issuedCredentialId, ...additionalData } = request;
24
28
  const credential = {
25
29
  '@context': [...(context || []), ...VC_CONTEXT],
26
30
  type: [...new Set([...(type || []), VC_TYPE])],
@@ -37,133 +41,314 @@ export class Credentials {
37
41
  credential.expirationDate = expirationDate;
38
42
  }
39
43
  const statusOptions = credentialStatus || null;
40
- // Handle credential issuance and connector logic
41
- switch (providerId || connector) {
42
- case CredentialConnectors.Dock: {
43
- const dock = new DockIdentityService();
44
- // validate issuerDid in provider
45
- const existingIssuer = await dock.getDid(issuerDid, customer).catch(() => undefined);
46
- if (!existingIssuer) {
47
- // export from wallet
48
- const exportResult = await new IdentityServiceStrategySetup(customer.customerId).agent.exportDid(issuerDid, process.env.PROVIDER_EXPORT_PASSWORD || '', customer);
49
- // import into provider
50
- await dock.importDidV2(issuerDid, exportResult, process.env.PROVIDER_EXPORT_PASSWORD, customer);
51
- }
52
- const dockCredential = await dock.createCredential(credential, format, statusOptions, customer);
53
- const credentialType = Array.isArray(dockCredential.type)
54
- ? dockCredential.type
55
- : [dockCredential.type || 'VerifiableCredential'];
56
- // Create IssuedCredentialEntity record
57
- await this.create(customer, {
58
- providerId: 'dock',
59
- providerCredentialId: dockCredential.id,
60
- issuerId: issuerDid,
61
- subjectId: subjectDid,
62
- format: (format || 'jwt'),
63
- type: credentialType,
64
- category: category,
65
- status: 'issued',
66
- issuedAt: dockCredential.issuanceDate ? new Date(dockCredential.issuanceDate) : new Date(),
67
- expiresAt: dockCredential.expirationDate ? new Date(dockCredential.expirationDate) : undefined,
68
- credentialStatus: dockCredential.credentialStatus,
69
- metadata: {
44
+ // Phase 1: Atomic Index Reservation with CAS
45
+ let reservedIndex;
46
+ let statusRegistryId;
47
+ if (statusOptions && !issuedCredentialId) {
48
+ // Reserve index atomically using CAS pattern
49
+ const reservation = await this.reserveStatusIndex(statusOptions, issuerDid, customer);
50
+ reservedIndex = reservation.index;
51
+ statusRegistryId = reservation.registryId;
52
+ // Do not allow the issuer to override with a different index
53
+ if (statusOptions.statusListIndex && statusOptions.statusListIndex !== reservedIndex) {
54
+ throw new Error(`Expected statusListIndex ${reservedIndex} but got ${statusOptions.statusListIndex}`);
55
+ }
56
+ statusOptions.statusListIndex = reservedIndex;
57
+ }
58
+ // Phase 2: Create tracking record immediately to reserve the index
59
+ // This ensures the index is tracked even if credential creation fails
60
+ let trackingRecord;
61
+ if (issuedCredentialId) {
62
+ const existingRecord = await this.fetch(issuedCredentialId, customer);
63
+ if (!existingRecord) {
64
+ throw new Error(`Issued Credential with ID ${issuedCredentialId} not found for customer ${customer.customerId}`);
65
+ }
66
+ trackingRecord = existingRecord;
67
+ }
68
+ else {
69
+ trackingRecord = await this.create(customer, {
70
+ providerId: providerId || 'studio',
71
+ issuerId: issuerDid,
72
+ subjectId: subjectDid,
73
+ format: (format || 'jsonld'),
74
+ category: category || CredentialCategory.CREDENTIAL,
75
+ type: type || ['VerifiableCredential'],
76
+ status: 'issued',
77
+ issuedAt: new Date(),
78
+ statusRegistryId: statusRegistryId,
79
+ statusIndex: reservedIndex,
80
+ retryCount: 0,
81
+ });
82
+ }
83
+ // Phase 3: Attempt credential creation with error handling
84
+ try {
85
+ let verifiableCredential;
86
+ let providerCredentialId;
87
+ let credentialMetadata = {};
88
+ switch (providerId || connector) {
89
+ case CredentialConnectors.Dock: {
90
+ const dock = new DockIdentityService();
91
+ // validate issuerDid in provider
92
+ const existingIssuer = await dock.getDid(issuerDid, customer).catch(() => undefined);
93
+ if (!existingIssuer) {
94
+ // export from wallet
95
+ const exportResult = await new IdentityServiceStrategySetup(customer.customerId).agent.exportDid(issuerDid, process.env.PROVIDER_EXPORT_PASSWORD || '', customer);
96
+ // import into provider
97
+ await dock.importDidV2(issuerDid, exportResult, process.env.PROVIDER_EXPORT_PASSWORD, customer);
98
+ }
99
+ const dockCredential = await dock.createCredential(credential, format, statusOptions, customer);
100
+ verifiableCredential = dockCredential;
101
+ providerCredentialId = dockCredential.id;
102
+ credentialMetadata = {
70
103
  schema: dockCredential.credentialSchema,
71
104
  proof: dockCredential.proof,
72
105
  termsOfUse: additionalData.termsOfUse,
73
106
  contexts: [...(context || []), ...VC_CONTEXT],
74
- },
75
- });
76
- return dockCredential;
77
- }
78
- case CredentialConnectors.Resource:
79
- case CredentialConnectors.Studio:
80
- case CredentialConnectors.Verida:
81
- default: {
82
- const verifiable_credential = await new IdentityServiceStrategySetup(customer.customerId).agent.createCredential(credential, format, statusOptions, customer);
83
- const isVeridaDid = new VeridaDIDValidator().validate(subjectDid);
84
- let sendCredentialResponse;
85
- if (ENABLE_VERIDA_CONNECTOR === 'true' &&
86
- connector === CredentialConnectors.Verida &&
87
- isVeridaDid.valid &&
88
- isVeridaDid.namespace) {
89
- if (!credentialSchema)
90
- throw new Error('Credential schema is required');
91
- // dynamic import to avoid circular dependency
92
- const { VeridaService } = await import('../connectors/verida.js');
93
- sendCredentialResponse = await VeridaService.instance.sendCredential(isVeridaDid.namespace, subjectDid, 'New Verifiable Credential', verifiable_credential, credentialName || v4(), credentialSchema, credentialSummary);
94
- }
95
- else if (connector && connector === CredentialConnectors.Resource) {
96
- sendCredentialResponse = await ResourceConnector.instance.sendCredential(customer, issuerDid, verifiable_credential, credentialName || v4(), type ? type[0] : 'VerifiableCredential', v4(), undefined, credentialId);
97
- }
98
- // Create IssuedCredentialEntity record for Studio/Resource credentials
99
- // Get resourceId from ResourceConnector response if available
100
- let providerCredentialId;
101
- if (sendCredentialResponse && sendCredentialResponse.resourceId) {
102
- providerCredentialId = sendCredentialResponse.resourceId;
103
- }
104
- else {
105
- providerCredentialId = verifiable_credential.id;
107
+ };
108
+ break;
106
109
  }
107
- const credentialType = Array.isArray(verifiable_credential.type)
108
- ? verifiable_credential.type
109
- : [verifiable_credential.type || 'VerifiableCredential'];
110
- await this.create(customer, {
111
- providerId: 'studio',
112
- providerCredentialId,
113
- issuerId: issuerDid,
114
- subjectId: subjectDid,
115
- format: (format || 'jsonld'),
116
- type: credentialType,
117
- category: category,
118
- status: 'issued',
119
- issuedAt: verifiable_credential.issuanceDate
120
- ? new Date(verifiable_credential.issuanceDate)
121
- : new Date(),
122
- expiresAt: verifiable_credential.expirationDate
123
- ? new Date(verifiable_credential.expirationDate)
124
- : undefined,
125
- credentialStatus: verifiable_credential.credentialStatus,
126
- metadata: {
110
+ case CredentialConnectors.Resource:
111
+ case CredentialConnectors.Studio:
112
+ case CredentialConnectors.Verida:
113
+ default: {
114
+ const verifiable_credential = await new IdentityServiceStrategySetup(customer.customerId).agent.createCredential(credential, format, statusOptions, customer);
115
+ const isVeridaDid = new VeridaDIDValidator().validate(subjectDid);
116
+ let sendCredentialResponse;
117
+ if (ENABLE_VERIDA_CONNECTOR === 'true' &&
118
+ connector === CredentialConnectors.Verida &&
119
+ isVeridaDid.valid &&
120
+ isVeridaDid.namespace) {
121
+ if (!credentialSchema)
122
+ throw new Error('Credential schema is required');
123
+ // dynamic import to avoid circular dependency
124
+ const { VeridaService } = await import('../connectors/verida.js');
125
+ sendCredentialResponse = await VeridaService.instance.sendCredential(isVeridaDid.namespace, subjectDid, 'New Verifiable Credential', verifiable_credential, credentialName || v4(), credentialSchema, credentialSummary);
126
+ }
127
+ else if (connector && connector === CredentialConnectors.Resource) {
128
+ sendCredentialResponse = await ResourceConnector.instance.sendCredential(customer, issuerDid, verifiable_credential, credentialName || v4(), type ? type[0] : 'VerifiableCredential', v4(), undefined, credentialId);
129
+ }
130
+ // Get resourceId from ResourceConnector response if available
131
+ if (sendCredentialResponse && sendCredentialResponse.resourceId) {
132
+ providerCredentialId = sendCredentialResponse.resourceId;
133
+ }
134
+ else {
135
+ providerCredentialId = verifiable_credential.id;
136
+ }
137
+ verifiableCredential = verifiable_credential;
138
+ credentialMetadata = {
127
139
  schema: verifiable_credential.credentialSchema,
128
140
  proof: verifiable_credential.proof,
129
141
  resourceType: sendCredentialResponse?.resourceType,
130
142
  didUrl: sendCredentialResponse?.didUrl,
131
143
  termsOfUse: additionalData.termsOfUse,
132
144
  contexts: [...(context || []), ...VC_CONTEXT],
145
+ };
146
+ break;
147
+ }
148
+ }
149
+ // Phase 4: Update tracking record with success details
150
+ const credentialType = Array.isArray(verifiableCredential.type)
151
+ ? verifiableCredential.type
152
+ : [verifiableCredential.type || 'VerifiableCredential'];
153
+ await this.update(trackingRecord.issuedCredentialId, {
154
+ providerCredentialId: providerCredentialId,
155
+ metadata: credentialMetadata,
156
+ status: 'issued',
157
+ }, customer);
158
+ // Also update fields not covered by the update() method
159
+ await this.repository.update({ issuedCredentialId: trackingRecord.issuedCredentialId }, {
160
+ type: credentialType,
161
+ issuedAt: verifiableCredential.issuanceDate
162
+ ? new Date(verifiableCredential.issuanceDate)
163
+ : trackingRecord.issuedAt,
164
+ expiresAt: verifiableCredential.expirationDate
165
+ ? new Date(verifiableCredential.expirationDate)
166
+ : undefined,
167
+ credentialStatus: verifiableCredential.credentialStatus,
168
+ });
169
+ return verifiableCredential;
170
+ }
171
+ catch (error) {
172
+ // Phase 5: Update tracking record with failure details
173
+ // This ensures the reserved index is tracked even when credential creation fails
174
+ await this.repository.update({ issuedCredentialId: trackingRecord.issuedCredentialId }, {
175
+ status: 'unknown',
176
+ retryCount: trackingRecord.retryCount + 1,
177
+ lastError: error instanceof Error ? error.message : String(error),
178
+ });
179
+ // Re-throw the error so the caller knows the credential creation failed
180
+ throw error;
181
+ }
182
+ }
183
+ /**
184
+ * Phase 1: Atomic Index Reservation with CAS
185
+ * Reserves a unique index using Compare-And-Swap pattern
186
+ * Implements lock-free allocation with exponential backoff retry
187
+ */
188
+ async reserveStatusIndex(statusOptions, issuerDid, customer, maxRetries = 5) {
189
+ let attempt = 0;
190
+ const baseDelay = 5; // ms
191
+ while (attempt < maxRetries) {
192
+ // Step 1: Read current state (lock-free)
193
+ // Query entity directly to get version field for CAS
194
+ let statusRegistry = null;
195
+ if (statusOptions.statusListName && statusOptions.statusListType) {
196
+ // Determine registryType based on statusListType and statusPurpose
197
+ let registryType;
198
+ if (statusOptions.statusListType === StatusListType.Bitstring) {
199
+ registryType = BitstringStatusListResourceType;
200
+ }
201
+ else if (statusOptions.statusListType === StatusListType.StatusList2021) {
202
+ // Capitalize first letter of statusPurpose (revocation -> Revocation)
203
+ const capitalizedPurpose = statusOptions.statusPurpose
204
+ ? statusOptions.statusPurpose.charAt(0).toUpperCase() + statusOptions.statusPurpose.slice(1)
205
+ : '';
206
+ registryType = `${statusOptions.statusListType}${capitalizedPurpose}`;
207
+ }
208
+ else {
209
+ registryType = statusOptions.statusListType;
210
+ }
211
+ statusRegistry = await this.statusRegistryRepository.findOne({
212
+ where: {
213
+ registryName: statusOptions.statusListName,
214
+ registryType: registryType,
215
+ customer: { customerId: customer.customerId },
216
+ identifier: { did: issuerDid },
133
217
  },
218
+ relations: ['identifier'],
134
219
  });
135
- return verifiable_credential;
220
+ }
221
+ if (!statusRegistry) {
222
+ throw new Error('Status Registry Not Found');
223
+ }
224
+ // Validation checks
225
+ if (statusRegistry.state === StatusRegistryState.Full) {
226
+ throw new Error('Status Registry is Full');
227
+ }
228
+ if (statusRegistry.state !== StatusRegistryState.Active) {
229
+ throw new Error(`Status Registry is not Active. Current state: ${statusRegistry.state}`);
230
+ }
231
+ // Check capacity
232
+ if (statusRegistry.writeCursor >= statusRegistry.registrySize) {
233
+ throw new Error('Status Registry has reached capacity');
234
+ }
235
+ // Calculate next index
236
+ let nextIndex = statusRegistry.writeCursor + 1;
237
+ // Check if the next index is already used (from migration of historical credentials)
238
+ const additionalUsedIndexes = statusRegistry.metadata?.additionalUsedIndexes || [];
239
+ while (additionalUsedIndexes.includes(nextIndex)) {
240
+ nextIndex++;
241
+ // Safety check: ensure we don't exceed registry size
242
+ if (nextIndex >= statusRegistry.registrySize) {
243
+ throw new Error('Status Registry has reached capacity (including additional used indexes)');
244
+ }
245
+ }
246
+ const currentVersion = statusRegistry.version;
247
+ // Step 2: Reserve via Compare-And-Swap
248
+ const updates = {
249
+ writeCursor: nextIndex,
250
+ };
251
+ // Check if registry will be FULL after this allocation
252
+ if (nextIndex >= statusRegistry.registrySize) {
253
+ updates.state = StatusRegistryState.Full;
254
+ }
255
+ // Attempt CAS update using QueryBuilder
256
+ const result = await this.statusRegistryRepository
257
+ .createQueryBuilder()
258
+ .update(StatusRegistryEntity)
259
+ .set({
260
+ ...updates,
261
+ version: currentVersion + 1,
262
+ updatedAt: new Date(),
263
+ })
264
+ .where('registryId = :registryId', { registryId: statusRegistry.registryId })
265
+ .andWhere('version = :version', { version: currentVersion })
266
+ .execute();
267
+ const casSuccess = (result.affected ?? 0) === 1;
268
+ if (casSuccess) {
269
+ // Success! Return reserved index and registryId
270
+ // Check if we need to trigger rotation (threshold or full)
271
+ // Calculate utilization including additional used indexes
272
+ const totalUsedIndexes = nextIndex + additionalUsedIndexes.length;
273
+ const utilizationPercent = (totalUsedIndexes / statusRegistry.registrySize) * 100;
274
+ if (utilizationPercent >= statusRegistry.threshold_percentage ||
275
+ nextIndex >= statusRegistry.registrySize) {
276
+ const trackInfo = {
277
+ category: OperationCategoryNameEnum.CREDENTIAL_STATUS,
278
+ name: nextIndex >= statusRegistry.registrySize
279
+ ? OperationNameEnum.CREDENTIAL_STATUS_FULL
280
+ : OperationNameEnum.CREDENTIAL_STATUS_THRESHOLD_REACHED,
281
+ customer: customer,
282
+ data: {
283
+ did: issuerDid,
284
+ registryId: statusRegistry.registryId,
285
+ },
286
+ };
287
+ // Track operation
288
+ eventTracker.emit('track', trackInfo);
289
+ }
290
+ return { index: nextIndex, registryId: statusRegistry.registryId };
291
+ }
292
+ // CAS failed - concurrent modification detected
293
+ attempt++;
294
+ if (attempt < maxRetries) {
295
+ // Exponential backoff
296
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), 1000);
297
+ await new Promise((resolve) => setTimeout(resolve, delay));
136
298
  }
137
299
  }
300
+ throw new Error(`Failed to reserve index after ${maxRetries} attempts - high concurrency`);
138
301
  }
139
302
  /**
140
303
  * List issued credentials with pagination and filtering
141
304
  */
142
305
  async list(customer, options = {}) {
143
- const { page = 1, limit = 10, providerId, issuerId, subjectId, status, format, createdAt, category } = options;
144
- const where = {
145
- customer: { customerId: customer.customerId },
146
- };
306
+ const { page = 1, limit = 10, providerId, issuerId, subjectId, status, format, createdAt, category, credentialType, network, statusRegistryId, } = options;
307
+ // Used queryBuilder because of "type" filter which is JSON object in DB
308
+ const queryBuilder = this.repository
309
+ .createQueryBuilder('ic')
310
+ .leftJoinAndSelect('ic.statusRegistry', 'statusRegistry')
311
+ .where('ic.customerId = :customerId', { customerId: customer.customerId });
147
312
  if (providerId)
148
- where.providerId = providerId;
313
+ queryBuilder.andWhere('ic.providerId = :providerId', { providerId });
149
314
  if (issuerId)
150
- where.issuerId = issuerId;
315
+ queryBuilder.andWhere('ic.issuerId = :issuerId', { issuerId });
151
316
  if (subjectId)
152
- where.subjectId = subjectId;
317
+ queryBuilder.andWhere('ic.subjectId = :subjectId', { subjectId });
153
318
  if (status)
154
- where.status = status;
319
+ queryBuilder.andWhere('ic.status = :status', { status });
155
320
  if (format)
156
- where.format = format;
157
- if (createdAt)
158
- where.createdAt = LessThanOrEqual(new Date(createdAt));
321
+ queryBuilder.andWhere('ic.format = :format', { format });
159
322
  if (category)
160
- where.category = category;
161
- const [entities, total] = await this.repository.findAndCount({
162
- where,
163
- order: { createdAt: 'DESC' },
164
- skip: (page - 1) * limit,
165
- take: limit,
166
- });
323
+ queryBuilder.andWhere('ic.category = :category', { category });
324
+ if (createdAt)
325
+ queryBuilder.andWhere('ic.createdAt <= :createdAt', { createdAt: new Date(createdAt) });
326
+ if (network) {
327
+ // Filter by network in the DID (e.g., did:cheqd:mainnet:... or did:cheqd:testnet:...)
328
+ queryBuilder.andWhere('ic.issuerId LIKE :network', { network: `%:${network}:%` });
329
+ }
330
+ if (credentialType) {
331
+ if (credentialType === 'VerifiableCredential') {
332
+ // Exact match for VerifiableCredential (only credentials with type = ["VerifiableCredential"])
333
+ queryBuilder.andWhere('ic.type::jsonb = :credentialType::jsonb', {
334
+ credentialType: JSON.stringify(['VerifiableCredential']),
335
+ });
336
+ }
337
+ else {
338
+ // Contains match for other types
339
+ queryBuilder.andWhere('ic.type::jsonb @> :credentialType::jsonb', {
340
+ credentialType: JSON.stringify([credentialType]),
341
+ });
342
+ }
343
+ }
344
+ if (statusRegistryId) {
345
+ queryBuilder.andWhere('statusRegistry.registryId = :statusRegistryId', { statusRegistryId });
346
+ }
347
+ const [entities, total] = await queryBuilder
348
+ .orderBy('ic.createdAt', 'DESC')
349
+ .skip((page - 1) * limit)
350
+ .take(limit)
351
+ .getManyAndCount();
167
352
  const credentials = entities.map((entity) => this.toResponse(entity, { includeCredential: false }));
168
353
  return { credentials, total };
169
354
  }
@@ -181,7 +366,7 @@ export class Credentials {
181
366
  issuedCredentialId: id,
182
367
  customer: { customerId: customer.customerId },
183
368
  },
184
- relations: ['customer'],
369
+ relations: ['customer', 'statusRegistry'],
185
370
  });
186
371
  }
187
372
  // Strategy 2: Try as providerCredentialId with provider hint
@@ -233,21 +418,26 @@ export class Credentials {
233
418
  * Create a new issued credential record
234
419
  */
235
420
  async create(customer, options) {
236
- const entity = this.repository.create({
237
- providerId: options.providerId,
421
+ // Resolve statusRegistry if statusRegistryId is provided
422
+ let statusRegistry;
423
+ if (options.statusRegistryId) {
424
+ statusRegistry = await this.statusRegistryRepository.findOne({
425
+ where: { registryId: options.statusRegistryId },
426
+ });
427
+ }
428
+ const entity = new IssuedCredentialEntity(options.providerId, options.format, options.category || CredentialCategory.CREDENTIAL, options.type, options.issuedAt, customer, {
238
429
  providerCredentialId: options.providerCredentialId,
239
430
  issuerId: options.issuerId,
240
431
  subjectId: options.subjectId,
241
- format: options.format,
242
- category: options.category || 'credential',
243
- type: options.type,
244
- status: options.status || 'issued',
432
+ status: options.status,
245
433
  statusUpdatedAt: options.statusUpdatedAt,
246
- issuedAt: options.issuedAt,
247
- expiresAt: options.expiresAt,
248
- credentialStatus: options.credentialStatus,
249
434
  metadata: options.metadata,
250
- customer: customer,
435
+ credentialStatus: options.credentialStatus,
436
+ statusRegistry: statusRegistry || undefined,
437
+ statusIndex: options.statusIndex,
438
+ retryCount: options.retryCount,
439
+ lastError: options.lastError,
440
+ expiresAt: options.expiresAt,
251
441
  });
252
442
  return await this.repository.save(entity);
253
443
  }
@@ -297,12 +487,31 @@ export class Credentials {
297
487
  issuedCredentialId,
298
488
  customer: { customerId: customer.customerId },
299
489
  },
490
+ relations: ['statusRegistry'],
300
491
  });
301
492
  if (!updatedEntity) {
302
493
  return null;
303
494
  }
304
495
  return this.toResponse(updatedEntity, {});
305
496
  }
497
+ /**
498
+ * Fetch a single issued credential record by ID
499
+ */
500
+ async fetch(id, customer) {
501
+ // Try multiple lookup strategies
502
+ let entity = null;
503
+ // Strategy 1: Try as issuedCredentialId (UUID)
504
+ if (uuidValidate(id)) {
505
+ entity = await this.repository.findOne({
506
+ where: {
507
+ issuedCredentialId: id,
508
+ customer: { customerId: customer.customerId },
509
+ },
510
+ relations: ['customer', 'statusRegistry'],
511
+ });
512
+ }
513
+ return entity;
514
+ }
306
515
  /**
307
516
  * Convert entity to API response format
308
517
  */
@@ -321,6 +530,10 @@ export class Credentials {
321
530
  issuedAt: entity.issuedAt.toISOString(),
322
531
  expiresAt: entity.expiresAt?.toISOString(),
323
532
  credentialStatus: entity.credentialStatus,
533
+ statusRegistryId: entity.statusRegistry?.registryId,
534
+ statusIndex: entity.statusIndex,
535
+ retryCount: entity.retryCount,
536
+ lastError: entity.lastError,
324
537
  createdAt: entity.createdAt?.toISOString(),
325
538
  updatedAt: entity.updatedAt?.toISOString(),
326
539
  };