@credo-ts/indy-vdr 0.6.1-pr-2091-20241119140918 → 0.6.2-alpha-20251210145840

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 (141) hide show
  1. package/build/IndyVdrApi.d.mts +42 -0
  2. package/build/IndyVdrApi.d.mts.map +1 -0
  3. package/build/IndyVdrApi.mjs +72 -0
  4. package/build/IndyVdrApi.mjs.map +1 -0
  5. package/build/IndyVdrModule.d.mts +20 -0
  6. package/build/IndyVdrModule.d.mts.map +1 -0
  7. package/build/IndyVdrModule.mjs +30 -0
  8. package/build/IndyVdrModule.mjs.map +1 -0
  9. package/build/IndyVdrModuleConfig.d.mts +72 -0
  10. package/build/IndyVdrModuleConfig.d.mts.map +1 -0
  11. package/build/IndyVdrModuleConfig.mjs +18 -0
  12. package/build/IndyVdrModuleConfig.mjs.map +1 -0
  13. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorate.mjs +10 -0
  14. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateMetadata.mjs +7 -0
  15. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateParam.mjs +9 -0
  16. package/build/anoncreds/IndyVdrAnonCredsRegistry.d.mts +125 -0
  17. package/build/anoncreds/IndyVdrAnonCredsRegistry.d.mts.map +1 -0
  18. package/build/anoncreds/IndyVdrAnonCredsRegistry.mjs +586 -0
  19. package/build/anoncreds/IndyVdrAnonCredsRegistry.mjs.map +1 -0
  20. package/build/anoncreds/index.d.mts +1 -0
  21. package/build/anoncreds/index.mjs +1 -0
  22. package/build/anoncreds/utils/identifiers.mjs +29 -0
  23. package/build/anoncreds/utils/identifiers.mjs.map +1 -0
  24. package/build/anoncreds/utils/transform.mjs +63 -0
  25. package/build/anoncreds/utils/transform.mjs.map +1 -0
  26. package/build/dids/IndyVdrIndyDidRegistrar.d.mts +92 -0
  27. package/build/dids/IndyVdrIndyDidRegistrar.d.mts.map +1 -0
  28. package/build/dids/IndyVdrIndyDidRegistrar.mjs +290 -0
  29. package/build/dids/IndyVdrIndyDidRegistrar.mjs.map +1 -0
  30. package/build/dids/IndyVdrIndyDidResolver.d.mts +12 -0
  31. package/build/dids/IndyVdrIndyDidResolver.d.mts.map +1 -0
  32. package/build/dids/IndyVdrIndyDidResolver.mjs +36 -0
  33. package/build/dids/IndyVdrIndyDidResolver.mjs.map +1 -0
  34. package/build/dids/IndyVdrSovDidResolver.d.mts +13 -0
  35. package/build/dids/IndyVdrSovDidResolver.d.mts.map +1 -0
  36. package/build/dids/IndyVdrSovDidResolver.mjs +70 -0
  37. package/build/dids/IndyVdrSovDidResolver.mjs.map +1 -0
  38. package/build/dids/didIndyUtil.mjs +147 -0
  39. package/build/dids/didIndyUtil.mjs.map +1 -0
  40. package/build/dids/didSovUtil.mjs +118 -0
  41. package/build/dids/didSovUtil.mjs.map +1 -0
  42. package/build/dids/index.d.mts +3 -0
  43. package/build/dids/index.mjs +3 -0
  44. package/build/error/IndyVdrError.mjs +12 -0
  45. package/build/error/IndyVdrError.mjs.map +1 -0
  46. package/build/error/IndyVdrNotConfiguredError.mjs +12 -0
  47. package/build/error/IndyVdrNotConfiguredError.mjs.map +1 -0
  48. package/build/error/IndyVdrNotFound.mjs +12 -0
  49. package/build/error/IndyVdrNotFound.mjs.map +1 -0
  50. package/build/error/index.mjs +3 -0
  51. package/build/index.d.mts +12 -0
  52. package/build/index.mjs +12 -0
  53. package/build/pool/IndyVdrPool.d.mts +61 -0
  54. package/build/pool/IndyVdrPool.d.mts.map +1 -0
  55. package/build/pool/IndyVdrPool.mjs +104 -0
  56. package/build/pool/IndyVdrPool.mjs.map +1 -0
  57. package/build/pool/IndyVdrPoolService.d.mts +54 -0
  58. package/build/pool/IndyVdrPoolService.d.mts.map +1 -0
  59. package/build/pool/IndyVdrPoolService.mjs +157 -0
  60. package/build/pool/IndyVdrPoolService.mjs.map +1 -0
  61. package/build/pool/index.d.mts +2 -0
  62. package/build/pool/index.mjs +2 -0
  63. package/build/utils/did.mjs +48 -0
  64. package/build/utils/did.mjs.map +1 -0
  65. package/build/utils/promises.mjs +20 -0
  66. package/build/utils/promises.mjs.map +1 -0
  67. package/build/utils/sign.mjs +24 -0
  68. package/build/utils/sign.mjs.map +1 -0
  69. package/package.json +19 -19
  70. package/build/IndyVdrApi.d.ts +0 -34
  71. package/build/IndyVdrApi.js +0 -82
  72. package/build/IndyVdrApi.js.map +0 -1
  73. package/build/IndyVdrModule.d.ts +0 -14
  74. package/build/IndyVdrModule.js +0 -31
  75. package/build/IndyVdrModule.js.map +0 -1
  76. package/build/IndyVdrModuleConfig.d.ts +0 -66
  77. package/build/IndyVdrModuleConfig.js +0 -18
  78. package/build/IndyVdrModuleConfig.js.map +0 -1
  79. package/build/anoncreds/IndyVdrAnonCredsRegistry.d.ts +0 -113
  80. package/build/anoncreds/IndyVdrAnonCredsRegistry.js +0 -682
  81. package/build/anoncreds/IndyVdrAnonCredsRegistry.js.map +0 -1
  82. package/build/anoncreds/index.d.ts +0 -1
  83. package/build/anoncreds/index.js +0 -18
  84. package/build/anoncreds/index.js.map +0 -1
  85. package/build/anoncreds/utils/identifiers.d.ts +0 -5
  86. package/build/anoncreds/utils/identifiers.js +0 -40
  87. package/build/anoncreds/utils/identifiers.js.map +0 -1
  88. package/build/anoncreds/utils/transform.d.ts +0 -32
  89. package/build/anoncreds/utils/transform.js +0 -91
  90. package/build/anoncreds/utils/transform.js.map +0 -1
  91. package/build/dids/IndyVdrIndyDidRegistrar.d.ts +0 -85
  92. package/build/dids/IndyVdrIndyDidRegistrar.js +0 -338
  93. package/build/dids/IndyVdrIndyDidRegistrar.js.map +0 -1
  94. package/build/dids/IndyVdrIndyDidResolver.d.ts +0 -7
  95. package/build/dids/IndyVdrIndyDidResolver.js +0 -39
  96. package/build/dids/IndyVdrIndyDidResolver.js.map +0 -1
  97. package/build/dids/IndyVdrSovDidResolver.d.ts +0 -8
  98. package/build/dids/IndyVdrSovDidResolver.js +0 -79
  99. package/build/dids/IndyVdrSovDidResolver.js.map +0 -1
  100. package/build/dids/didIndyUtil.d.ts +0 -47
  101. package/build/dids/didIndyUtil.js +0 -241
  102. package/build/dids/didIndyUtil.js.map +0 -1
  103. package/build/dids/didSovUtil.d.ts +0 -26
  104. package/build/dids/didSovUtil.js +0 -180
  105. package/build/dids/didSovUtil.js.map +0 -1
  106. package/build/dids/index.d.ts +0 -3
  107. package/build/dids/index.js +0 -10
  108. package/build/dids/index.js.map +0 -1
  109. package/build/error/IndyVdrError.d.ts +0 -6
  110. package/build/error/IndyVdrError.js +0 -11
  111. package/build/error/IndyVdrError.js.map +0 -1
  112. package/build/error/IndyVdrNotConfiguredError.d.ts +0 -6
  113. package/build/error/IndyVdrNotConfiguredError.js +0 -11
  114. package/build/error/IndyVdrNotConfiguredError.js.map +0 -1
  115. package/build/error/IndyVdrNotFound.d.ts +0 -6
  116. package/build/error/IndyVdrNotFound.js +0 -11
  117. package/build/error/IndyVdrNotFound.js.map +0 -1
  118. package/build/error/index.d.ts +0 -3
  119. package/build/error/index.js +0 -20
  120. package/build/error/index.js.map +0 -1
  121. package/build/index.d.ts +0 -5
  122. package/build/index.js +0 -27
  123. package/build/index.js.map +0 -1
  124. package/build/pool/IndyVdrPool.d.ts +0 -54
  125. package/build/pool/IndyVdrPool.js +0 -131
  126. package/build/pool/IndyVdrPool.js.map +0 -1
  127. package/build/pool/IndyVdrPoolService.d.ts +0 -55
  128. package/build/pool/IndyVdrPoolService.js +0 -175
  129. package/build/pool/IndyVdrPoolService.js.map +0 -1
  130. package/build/pool/index.d.ts +0 -2
  131. package/build/pool/index.js +0 -19
  132. package/build/pool/index.js.map +0 -1
  133. package/build/utils/did.d.ts +0 -32
  134. package/build/utils/did.js +0 -57
  135. package/build/utils/did.js.map +0 -1
  136. package/build/utils/promises.d.ts +0 -11
  137. package/build/utils/promises.js +0 -26
  138. package/build/utils/promises.js.map +0 -1
  139. package/build/utils/sign.d.ts +0 -5
  140. package/build/utils/sign.js +0 -23
  141. package/build/utils/sign.js.map +0 -1
@@ -0,0 +1,290 @@
1
+ import { IndyVdrError } from "../error/IndyVdrError.mjs";
2
+ import "../error/index.mjs";
3
+ import { endpointsAttribFromServices } from "./didSovUtil.mjs";
4
+ import { createKeyAgreementKey, didDocDiff, indyDidDocumentFromDid, verificationPublicJwkForIndyDid } from "./didIndyUtil.mjs";
5
+ import { IndyVdrPoolService } from "../pool/IndyVdrPoolService.mjs";
6
+ import { parseIndyDid } from "@credo-ts/anoncreds";
7
+ import { CredoError, DidCommV1Service, DidCommV2Service, DidDocumentRole, DidRecord, DidRepository, Hasher, IndyAgentService, Kms, NewDidCommV2Service, TypedArrayEncoder } from "@credo-ts/core";
8
+ import { AttribRequest, CustomRequest, NymRequest } from "@hyperledger/indy-vdr-shared";
9
+
10
+ //#region src/dids/IndyVdrIndyDidRegistrar.ts
11
+ var IndyVdrIndyDidRegistrar = class {
12
+ constructor() {
13
+ this.supportedMethods = ["indy"];
14
+ }
15
+ didCreateActionResult({ namespace, didAction, did }) {
16
+ return {
17
+ jobId: did,
18
+ didDocumentMetadata: {},
19
+ didRegistrationMetadata: { didIndyNamespace: namespace },
20
+ didState: didAction
21
+ };
22
+ }
23
+ didCreateFailedResult({ reason }) {
24
+ return {
25
+ didDocumentMetadata: {},
26
+ didRegistrationMetadata: {},
27
+ didState: {
28
+ state: "failed",
29
+ reason
30
+ }
31
+ };
32
+ }
33
+ didCreateFinishedResult({ did, didDocument, namespace }) {
34
+ return {
35
+ didDocumentMetadata: {},
36
+ didRegistrationMetadata: { didIndyNamespace: namespace },
37
+ didState: {
38
+ state: "finished",
39
+ did,
40
+ didDocument
41
+ }
42
+ };
43
+ }
44
+ async parseInput(agentContext, options) {
45
+ if (options.options.endorsedTransaction) {
46
+ if (!options.did || typeof options.did !== "string") return {
47
+ status: "error",
48
+ reason: "If endorsedTransaction is provided, a DID must also be provided"
49
+ };
50
+ const { namespace, namespaceIdentifier: namespaceIdentifier$1 } = parseIndyDid(options.did);
51
+ const endorserNamespaceIdentifier$1 = JSON.parse(options.options.endorsedTransaction.nymRequest).identifier;
52
+ return {
53
+ status: "ok",
54
+ type: "endorsedTransaction",
55
+ endorsedTransaction: options.options.endorsedTransaction,
56
+ did: options.did,
57
+ namespace,
58
+ namespaceIdentifier: namespaceIdentifier$1,
59
+ endorserNamespaceIdentifier: endorserNamespaceIdentifier$1
60
+ };
61
+ }
62
+ const endorserDid = options.options.endorserDid;
63
+ const { namespace: endorserNamespace, namespaceIdentifier: endorserNamespaceIdentifier } = parseIndyDid(endorserDid);
64
+ const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi);
65
+ const _verificationKey = options.options.keyId ? await kms.getPublicKey({ keyId: options.options.keyId }) : (await kms.createKey({ type: {
66
+ kty: "OKP",
67
+ crv: "Ed25519"
68
+ } })).publicJwk;
69
+ if (_verificationKey.kty !== "OKP" || _verificationKey.crv !== "Ed25519") return {
70
+ status: "error",
71
+ reason: `keyId must point to an Ed25519 key, but found ${Kms.getJwkHumanDescription(_verificationKey)}`
72
+ };
73
+ const verificationKey = Kms.PublicJwk.fromPublicJwk(_verificationKey);
74
+ const buffer = Hasher.hash(verificationKey.publicKey.publicKey, "sha-256");
75
+ const namespaceIdentifier = TypedArrayEncoder.toBase58(buffer.slice(0, 16));
76
+ return {
77
+ status: "ok",
78
+ type: "create",
79
+ did: `did:indy:${endorserNamespace}:${namespaceIdentifier}`,
80
+ verificationKey,
81
+ endorserDid: options.options.endorserDid,
82
+ alias: options.options.alias,
83
+ role: options.options.role,
84
+ services: options.options.services,
85
+ useEndpointAttrib: options.options.useEndpointAttrib,
86
+ namespaceIdentifier,
87
+ namespace: endorserNamespace,
88
+ endorserNamespaceIdentifier
89
+ };
90
+ }
91
+ async saveDidRecord(agentContext, did, didDocument, keys) {
92
+ const didRecord = new DidRecord({
93
+ did,
94
+ role: DidDocumentRole.Created,
95
+ didDocument,
96
+ keys
97
+ });
98
+ await agentContext.dependencyManager.resolve(DidRepository).save(agentContext, didRecord);
99
+ }
100
+ async getDidDocumentFromRecord(agentContext, did) {
101
+ const didRecord = await agentContext.dependencyManager.resolve(DidRepository).getSingleByQuery(agentContext, {
102
+ did,
103
+ role: DidDocumentRole.Created
104
+ });
105
+ if (!didRecord.didDocument) throw new CredoError(`Did record for did '${did}' has no did document.`);
106
+ return didRecord.didDocument;
107
+ }
108
+ createDidDocument(did, verificationKey, services, useEndpointAttrib) {
109
+ const verificationKeyBase58 = TypedArrayEncoder.toBase58(verificationKey.publicKey.publicKey);
110
+ const didDocumentBuilder = indyDidDocumentFromDid(did, verificationKeyBase58);
111
+ let diddocContent;
112
+ if (services) {
113
+ for (const item of services) {
114
+ const prependDidIfNotPresent = (id) => {
115
+ return id.startsWith("#") ? `${did}${id}` : id;
116
+ };
117
+ item.id = prependDidIfNotPresent(item.id);
118
+ if (item instanceof DidCommV1Service) item.recipientKeys = item.recipientKeys.map(prependDidIfNotPresent);
119
+ didDocumentBuilder.addService(item);
120
+ }
121
+ const commTypes = [
122
+ IndyAgentService.type,
123
+ DidCommV1Service.type,
124
+ NewDidCommV2Service.type,
125
+ DidCommV2Service.type
126
+ ];
127
+ const serviceTypes = new Set(services.map((item) => item.type));
128
+ const keyAgreementId = `${did}#key-agreement-1`;
129
+ if (commTypes.some((type) => serviceTypes.has(type))) didDocumentBuilder.addContext("https://w3id.org/security/suites/x25519-2019/v1").addVerificationMethod({
130
+ controller: did,
131
+ id: keyAgreementId,
132
+ publicKeyBase58: createKeyAgreementKey(verificationKeyBase58),
133
+ type: "X25519KeyAgreementKey2019"
134
+ }).addKeyAgreement(keyAgreementId);
135
+ if (serviceTypes.has(NewDidCommV2Service.type) || serviceTypes.has(DidCommV2Service.type)) didDocumentBuilder.addContext("https://didcomm.org/messaging/contexts/v2");
136
+ if (!useEndpointAttrib) diddocContent = didDocDiff(didDocumentBuilder.build().toJSON(), indyDidDocumentFromDid(did, verificationKeyBase58).build().toJSON());
137
+ }
138
+ const didDocument = didDocumentBuilder.build();
139
+ return {
140
+ diddocContent,
141
+ didDocument
142
+ };
143
+ }
144
+ async create(agentContext, options) {
145
+ try {
146
+ const res = await this.parseInput(agentContext, options);
147
+ if (res.status === "error") return this.didCreateFailedResult({ reason: res.reason });
148
+ const did = res.did;
149
+ const pool = agentContext.dependencyManager.resolve(IndyVdrPoolService).getPoolForNamespace(res.namespace);
150
+ let nymRequest;
151
+ let didDocument;
152
+ let attribRequest;
153
+ let verificationKey;
154
+ if (res.type === "endorsedTransaction") {
155
+ const { nymRequest: _nymRequest, attribRequest: _attribRequest } = res.endorsedTransaction;
156
+ nymRequest = new CustomRequest({ customRequest: _nymRequest });
157
+ attribRequest = _attribRequest ? new CustomRequest({ customRequest: _attribRequest }) : void 0;
158
+ } else {
159
+ const { services, useEndpointAttrib, alias, endorserNamespaceIdentifier, namespaceIdentifier, did: did$1, role, endorserDid, namespace } = res;
160
+ verificationKey = res.verificationKey;
161
+ const { didDocument: _didDocument, diddocContent } = this.createDidDocument(did$1, verificationKey, services, useEndpointAttrib);
162
+ didDocument = _didDocument;
163
+ const didRegisterSigningKey = options.options.endorserMode === "internal" ? await verificationPublicJwkForIndyDid(agentContext, options.options.endorserDid) : void 0;
164
+ nymRequest = await this.createRegisterDidWriteRequest({
165
+ agentContext,
166
+ pool,
167
+ signingKey: didRegisterSigningKey,
168
+ submitterNamespaceIdentifier: endorserNamespaceIdentifier,
169
+ namespaceIdentifier,
170
+ verificationKey,
171
+ alias,
172
+ diddocContent,
173
+ role
174
+ });
175
+ if (services && useEndpointAttrib) {
176
+ const endpoints = endpointsAttribFromServices(services);
177
+ attribRequest = await this.createSetDidEndpointsRequest({
178
+ agentContext,
179
+ pool,
180
+ signingKey: verificationKey,
181
+ endorserDid: options.options.endorserMode === "external" ? endorserDid : void 0,
182
+ unqualifiedDid: namespaceIdentifier,
183
+ endpoints
184
+ });
185
+ }
186
+ if (options.options.endorserMode === "external") {
187
+ await this.saveDidRecord(agentContext, did$1, didDocument, [{
188
+ didDocumentRelativeKeyId: "#verkey",
189
+ kmsKeyId: verificationKey.keyId
190
+ }]);
191
+ const didAction = {
192
+ state: "action",
193
+ action: "endorseIndyTransaction",
194
+ endorserDid,
195
+ nymRequest: nymRequest.body,
196
+ attribRequest: attribRequest?.body,
197
+ did: did$1
198
+ };
199
+ return this.didCreateActionResult({
200
+ namespace,
201
+ didAction,
202
+ did: did$1
203
+ });
204
+ }
205
+ }
206
+ await this.registerPublicDid(agentContext, pool, nymRequest);
207
+ if (attribRequest) await this.setEndpointsForDid(agentContext, pool, attribRequest);
208
+ if (verificationKey && didDocument) await this.saveDidRecord(agentContext, did, didDocument, [{
209
+ didDocumentRelativeKeyId: "#verkey",
210
+ kmsKeyId: verificationKey.keyId
211
+ }]);
212
+ didDocument = didDocument ?? await this.getDidDocumentFromRecord(agentContext, did);
213
+ return this.didCreateFinishedResult({
214
+ did,
215
+ didDocument,
216
+ namespace: res.namespace
217
+ });
218
+ } catch (error) {
219
+ agentContext.config.logger.error("Error creating indy did", { error });
220
+ return this.didCreateFailedResult({ reason: `unknownError: ${error.message}` });
221
+ }
222
+ }
223
+ async update() {
224
+ return {
225
+ didDocumentMetadata: {},
226
+ didRegistrationMetadata: {},
227
+ didState: {
228
+ state: "failed",
229
+ reason: "notImplemented: updating did:indy not implemented yet"
230
+ }
231
+ };
232
+ }
233
+ async deactivate() {
234
+ return {
235
+ didDocumentMetadata: {},
236
+ didRegistrationMetadata: {},
237
+ didState: {
238
+ state: "failed",
239
+ reason: "notImplemented: deactivating did:indy not implemented yet"
240
+ }
241
+ };
242
+ }
243
+ async createRegisterDidWriteRequest(options) {
244
+ const { agentContext, pool, submitterNamespaceIdentifier, namespaceIdentifier, verificationKey, alias, signingKey, role } = options;
245
+ if (options.diddocContent) throw new IndyVdrError("diddocContent is not yet supported");
246
+ const request = new NymRequest({
247
+ submitterDid: submitterNamespaceIdentifier,
248
+ dest: namespaceIdentifier,
249
+ verkey: TypedArrayEncoder.toBase58(verificationKey.publicKey.publicKey),
250
+ alias,
251
+ role
252
+ });
253
+ if (!signingKey) return request;
254
+ return await pool.prepareWriteRequest(agentContext, request, signingKey, void 0);
255
+ }
256
+ async registerPublicDid(agentContext, pool, writeRequest) {
257
+ const body = writeRequest.body;
258
+ try {
259
+ const response = await pool.submitRequest(writeRequest);
260
+ agentContext.config.logger.debug(`Register public did on ledger '${pool.indyNamespace}'\nRequest: ${body}}`, { response });
261
+ return;
262
+ } catch (error) {
263
+ agentContext.config.logger.error(`Error Registering public did on ledger '${pool.indyNamespace}'\nRequest: ${body}}`);
264
+ throw error;
265
+ }
266
+ }
267
+ async createSetDidEndpointsRequest(options) {
268
+ const { agentContext, pool, endpoints, unqualifiedDid, signingKey, endorserDid } = options;
269
+ const request = new AttribRequest({
270
+ submitterDid: unqualifiedDid,
271
+ targetDid: unqualifiedDid,
272
+ raw: JSON.stringify({ endpoint: endpoints })
273
+ });
274
+ return await pool.prepareWriteRequest(agentContext, request, signingKey, endorserDid);
275
+ }
276
+ async setEndpointsForDid(agentContext, pool, writeRequest) {
277
+ const body = writeRequest.body;
278
+ try {
279
+ const response = await pool.submitRequest(writeRequest);
280
+ agentContext.config.logger.debug(`Successfully set endpoints for did on ledger '${pool.indyNamespace}'.\nRequest: ${body}}`, { response });
281
+ } catch (error) {
282
+ agentContext.config.logger.error(`Error setting endpoints for did on ledger '${pool.indyNamespace}'.\nRequest: ${body}}`);
283
+ throw new IndyVdrError(error);
284
+ }
285
+ }
286
+ };
287
+
288
+ //#endregion
289
+ export { IndyVdrIndyDidRegistrar };
290
+ //# sourceMappingURL=IndyVdrIndyDidRegistrar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndyVdrIndyDidRegistrar.mjs","names":["endorserNamespaceIdentifier","diddocContent: Record<string, unknown> | undefined","nymRequest: NymRequest | CustomRequest","didDocument: DidDocument | undefined","attribRequest: AttribRequest | CustomRequest | undefined","verificationKey: Kms.PublicJwk<Kms.Ed25519PublicJwk> | undefined","did","didAction: EndorseDidTxAction"],"sources":["../../src/dids/IndyVdrIndyDidRegistrar.ts"],"sourcesContent":["import { parseIndyDid } from '@credo-ts/anoncreds'\nimport type {\n AgentContext,\n DidCreateOptions,\n DidCreateResult,\n DidDeactivateResult,\n DidDocument,\n DidDocumentKey,\n DidDocumentService,\n DidOperationStateActionBase,\n DidRegistrar,\n DidUpdateResult,\n} from '@credo-ts/core'\nimport {\n CredoError,\n DidCommV1Service,\n DidCommV2Service,\n DidDocumentRole,\n DidRecord,\n DidRepository,\n Hasher,\n IndyAgentService,\n Kms,\n NewDidCommV2Service,\n TypedArrayEncoder,\n} from '@credo-ts/core'\nimport type { IndyVdrRequest } from '@hyperledger/indy-vdr-shared'\nimport { AttribRequest, CustomRequest, NymRequest } from '@hyperledger/indy-vdr-shared'\nimport { IndyVdrError } from '../error'\nimport type { IndyVdrPool } from '../pool'\nimport { IndyVdrPoolService } from '../pool/IndyVdrPoolService'\nimport {\n createKeyAgreementKey,\n didDocDiff,\n indyDidDocumentFromDid,\n verificationPublicJwkForIndyDid,\n} from './didIndyUtil'\nimport type { IndyEndpointAttrib } from './didSovUtil'\nimport { endpointsAttribFromServices } from './didSovUtil'\n\nexport class IndyVdrIndyDidRegistrar implements DidRegistrar {\n public readonly supportedMethods = ['indy']\n\n private didCreateActionResult({\n namespace,\n didAction,\n did,\n }: {\n namespace: string\n didAction: EndorseDidTxAction\n did: string\n }): IndyVdrDidCreateResult {\n return {\n jobId: did,\n didDocumentMetadata: {},\n didRegistrationMetadata: {\n didIndyNamespace: namespace,\n },\n didState: didAction,\n }\n }\n\n private didCreateFailedResult({ reason }: { reason: string }): IndyVdrDidCreateResult {\n return {\n didDocumentMetadata: {},\n didRegistrationMetadata: {},\n didState: {\n state: 'failed',\n reason: reason,\n },\n }\n }\n\n private didCreateFinishedResult({\n did,\n didDocument,\n namespace,\n }: {\n did: string\n didDocument: DidDocument\n namespace: string\n }): IndyVdrDidCreateResult {\n return {\n didDocumentMetadata: {},\n didRegistrationMetadata: {\n didIndyNamespace: namespace,\n },\n didState: {\n state: 'finished',\n did,\n didDocument,\n },\n }\n }\n\n public async parseInput(agentContext: AgentContext, options: IndyVdrDidCreateOptions): Promise<ParseInputResult> {\n if (options.options.endorsedTransaction) {\n if (!options.did || typeof options.did !== 'string') {\n return {\n status: 'error',\n reason: 'If endorsedTransaction is provided, a DID must also be provided',\n }\n }\n const { namespace, namespaceIdentifier } = parseIndyDid(options.did)\n // endorser did from the transaction\n const endorserNamespaceIdentifier = JSON.parse(options.options.endorsedTransaction.nymRequest).identifier\n\n return {\n status: 'ok',\n type: 'endorsedTransaction',\n endorsedTransaction: options.options.endorsedTransaction,\n did: options.did,\n namespace,\n namespaceIdentifier,\n endorserNamespaceIdentifier,\n }\n }\n\n const endorserDid = options.options.endorserDid\n const { namespace: endorserNamespace, namespaceIdentifier: endorserNamespaceIdentifier } = parseIndyDid(endorserDid)\n\n const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi)\n\n const _verificationKey = options.options.keyId\n ? await kms.getPublicKey({ keyId: options.options.keyId })\n : (\n await kms.createKey({\n type: {\n kty: 'OKP',\n crv: 'Ed25519',\n },\n })\n ).publicJwk\n\n if (_verificationKey.kty !== 'OKP' || _verificationKey.crv !== 'Ed25519') {\n return {\n status: 'error',\n reason: `keyId must point to an Ed25519 key, but found ${Kms.getJwkHumanDescription(_verificationKey)}`,\n }\n }\n\n const verificationKey = Kms.PublicJwk.fromPublicJwk(_verificationKey) as Kms.PublicJwk<Kms.Ed25519PublicJwk>\n\n // Create a new key and calculate did according to the rules for indy did method\n const buffer = Hasher.hash(verificationKey.publicKey.publicKey, 'sha-256')\n\n const namespaceIdentifier = TypedArrayEncoder.toBase58(buffer.slice(0, 16))\n const did = `did:indy:${endorserNamespace}:${namespaceIdentifier}`\n\n return {\n status: 'ok',\n type: 'create',\n did,\n verificationKey,\n endorserDid: options.options.endorserDid,\n alias: options.options.alias,\n role: options.options.role,\n services: options.options.services,\n useEndpointAttrib: options.options.useEndpointAttrib,\n namespaceIdentifier,\n namespace: endorserNamespace,\n endorserNamespaceIdentifier,\n }\n }\n\n public async saveDidRecord(\n agentContext: AgentContext,\n did: string,\n didDocument: DidDocument,\n keys: DidDocumentKey[]\n ): Promise<void> {\n // Save the did so we know we created it and can issue with it\n const didRecord = new DidRecord({\n did,\n role: DidDocumentRole.Created,\n didDocument,\n keys,\n })\n\n const didRepository = agentContext.dependencyManager.resolve(DidRepository)\n await didRepository.save(agentContext, didRecord)\n }\n\n public async getDidDocumentFromRecord(agentContext: AgentContext, did: string): Promise<DidDocument> {\n const didRepository = agentContext.dependencyManager.resolve(DidRepository)\n const didRecord = await didRepository.getSingleByQuery(agentContext, {\n did,\n role: DidDocumentRole.Created,\n })\n\n if (!didRecord.didDocument) {\n throw new CredoError(`Did record for did '${did}' has no did document.`)\n }\n\n return didRecord.didDocument\n }\n\n private createDidDocument(\n did: string,\n verificationKey: Kms.PublicJwk<Kms.Ed25519PublicJwk>,\n services: DidDocumentService[] | undefined,\n useEndpointAttrib: boolean | undefined\n ) {\n const verificationKeyBase58 = TypedArrayEncoder.toBase58(verificationKey.publicKey.publicKey)\n // Create base did document\n const didDocumentBuilder = indyDidDocumentFromDid(did, verificationKeyBase58)\n let diddocContent: Record<string, unknown> | undefined\n\n // Add services if object was passed\n if (services) {\n for (const item of services) {\n const prependDidIfNotPresent = (id: string) => {\n return id.startsWith('#') ? `${did}${id}` : id\n }\n\n // Prepend the did to the service id if it is not already there\n item.id = prependDidIfNotPresent(item.id)\n\n // TODO: should we also prepend the did to routingKeys?\n if (item instanceof DidCommV1Service) {\n item.recipientKeys = item.recipientKeys.map(prependDidIfNotPresent)\n }\n\n didDocumentBuilder.addService(item)\n }\n\n const commTypes = [IndyAgentService.type, DidCommV1Service.type, NewDidCommV2Service.type, DidCommV2Service.type]\n const serviceTypes = new Set(services.map((item) => item.type))\n\n const keyAgreementId = `${did}#key-agreement-1`\n\n // If there is at least a communication service, add the key agreement key\n if (commTypes.some((type) => serviceTypes.has(type))) {\n didDocumentBuilder\n .addContext('https://w3id.org/security/suites/x25519-2019/v1')\n .addVerificationMethod({\n controller: did,\n id: keyAgreementId,\n publicKeyBase58: createKeyAgreementKey(verificationKeyBase58),\n type: 'X25519KeyAgreementKey2019',\n })\n .addKeyAgreement(keyAgreementId)\n }\n\n // FIXME: it doesn't seem this context exists?\n // If there is a DIDComm V2 service, add context\n if (serviceTypes.has(NewDidCommV2Service.type) || serviceTypes.has(DidCommV2Service.type)) {\n didDocumentBuilder.addContext('https://didcomm.org/messaging/contexts/v2')\n }\n\n if (!useEndpointAttrib) {\n // create diddocContent parameter based on the diff between the base and the resulting DID Document\n diddocContent = didDocDiff(\n didDocumentBuilder.build().toJSON(),\n indyDidDocumentFromDid(did, verificationKeyBase58).build().toJSON()\n )\n }\n }\n\n // Build did document\n const didDocument = didDocumentBuilder.build()\n\n return {\n diddocContent,\n didDocument,\n }\n }\n\n // FIXME: we need to completely revamp this logic, it's overly complex\n // We might even want to look at ditching the whole generic DIDs api ...\n public async create(agentContext: AgentContext, options: IndyVdrDidCreateOptions): Promise<IndyVdrDidCreateResult> {\n try {\n const res = await this.parseInput(agentContext, options)\n if (res.status === 'error') return this.didCreateFailedResult({ reason: res.reason })\n\n const did = res.did\n\n const pool = agentContext.dependencyManager.resolve(IndyVdrPoolService).getPoolForNamespace(res.namespace)\n\n let nymRequest: NymRequest | CustomRequest\n let didDocument: DidDocument | undefined\n let attribRequest: AttribRequest | CustomRequest | undefined\n let verificationKey: Kms.PublicJwk<Kms.Ed25519PublicJwk> | undefined\n\n if (res.type === 'endorsedTransaction') {\n const { nymRequest: _nymRequest, attribRequest: _attribRequest } = res.endorsedTransaction\n nymRequest = new CustomRequest({ customRequest: _nymRequest })\n attribRequest = _attribRequest ? new CustomRequest({ customRequest: _attribRequest }) : undefined\n } else {\n const {\n services,\n useEndpointAttrib,\n alias,\n endorserNamespaceIdentifier,\n namespaceIdentifier,\n did,\n role,\n endorserDid,\n namespace,\n } = res\n verificationKey = res.verificationKey\n\n const { didDocument: _didDocument, diddocContent } = this.createDidDocument(\n did,\n verificationKey,\n services,\n useEndpointAttrib\n )\n didDocument = _didDocument\n\n const didRegisterSigningKey =\n options.options.endorserMode === 'internal'\n ? await verificationPublicJwkForIndyDid(agentContext, options.options.endorserDid)\n : undefined\n\n nymRequest = await this.createRegisterDidWriteRequest({\n agentContext,\n pool,\n signingKey: didRegisterSigningKey,\n submitterNamespaceIdentifier: endorserNamespaceIdentifier,\n namespaceIdentifier,\n verificationKey,\n alias,\n diddocContent,\n role,\n })\n\n if (services && useEndpointAttrib) {\n const endpoints = endpointsAttribFromServices(services)\n attribRequest = await this.createSetDidEndpointsRequest({\n agentContext,\n pool,\n signingKey: verificationKey,\n endorserDid: options.options.endorserMode === 'external' ? endorserDid : undefined,\n unqualifiedDid: namespaceIdentifier,\n endpoints,\n })\n }\n\n if (options.options.endorserMode === 'external') {\n // We already save the did record, including the link between kms key id and did key id\n await this.saveDidRecord(agentContext, did, didDocument, [\n {\n didDocumentRelativeKeyId: '#verkey',\n kmsKeyId: verificationKey.keyId,\n },\n ])\n const didAction: EndorseDidTxAction = {\n state: 'action',\n action: 'endorseIndyTransaction',\n endorserDid: endorserDid,\n nymRequest: nymRequest.body,\n attribRequest: attribRequest?.body,\n did: did,\n }\n\n return this.didCreateActionResult({ namespace, didAction, did })\n }\n }\n\n await this.registerPublicDid(agentContext, pool, nymRequest)\n if (attribRequest) await this.setEndpointsForDid(agentContext, pool, attribRequest)\n\n // DID Document is undefined if this method is called based on external endorsement\n // but in that case the did document is already saved\n if (verificationKey && didDocument) {\n await this.saveDidRecord(agentContext, did, didDocument, [\n {\n didDocumentRelativeKeyId: '#verkey',\n kmsKeyId: verificationKey.keyId,\n },\n ])\n }\n\n didDocument = didDocument ?? (await this.getDidDocumentFromRecord(agentContext, did))\n return this.didCreateFinishedResult({ did, didDocument, namespace: res.namespace })\n } catch (error) {\n agentContext.config.logger.error('Error creating indy did', {\n error,\n })\n return this.didCreateFailedResult({\n reason: `unknownError: ${error.message}`,\n })\n }\n }\n\n public async update(): Promise<DidUpdateResult> {\n return {\n didDocumentMetadata: {},\n didRegistrationMetadata: {},\n didState: {\n state: 'failed',\n reason: 'notImplemented: updating did:indy not implemented yet',\n },\n }\n }\n\n public async deactivate(): Promise<DidDeactivateResult> {\n return {\n didDocumentMetadata: {},\n didRegistrationMetadata: {},\n didState: {\n state: 'failed',\n reason: 'notImplemented: deactivating did:indy not implemented yet',\n },\n }\n }\n\n private async createRegisterDidWriteRequest(options: {\n agentContext: AgentContext\n pool: IndyVdrPool\n submitterNamespaceIdentifier: string\n namespaceIdentifier: string\n verificationKey: Kms.PublicJwk<Kms.Ed25519PublicJwk>\n signingKey?: Kms.PublicJwk<Kms.Ed25519PublicJwk>\n alias: string | undefined\n diddocContent?: Record<string, unknown>\n role?: NymRequestRole\n }) {\n const {\n agentContext,\n pool,\n submitterNamespaceIdentifier,\n namespaceIdentifier,\n verificationKey,\n alias,\n signingKey,\n role,\n } = options\n\n // FIXME: Add diddocContent when supported by indy-vdr\n if (options.diddocContent) {\n throw new IndyVdrError('diddocContent is not yet supported')\n }\n\n const request = new NymRequest({\n submitterDid: submitterNamespaceIdentifier,\n dest: namespaceIdentifier,\n verkey: TypedArrayEncoder.toBase58(verificationKey.publicKey.publicKey),\n alias,\n role,\n })\n\n if (!signingKey) return request\n const writeRequest = await pool.prepareWriteRequest(agentContext, request, signingKey, undefined)\n return writeRequest\n }\n\n private async registerPublicDid<Request extends IndyVdrRequest>(\n agentContext: AgentContext,\n pool: IndyVdrPool,\n writeRequest: Request\n ) {\n const body = writeRequest.body\n try {\n const response = await pool.submitRequest(writeRequest)\n\n agentContext.config.logger.debug(`Register public did on ledger '${pool.indyNamespace}'\\nRequest: ${body}}`, {\n response,\n })\n\n return\n } catch (error) {\n agentContext.config.logger.error(\n `Error Registering public did on ledger '${pool.indyNamespace}'\\nRequest: ${body}}`\n )\n\n throw error\n }\n }\n\n private async createSetDidEndpointsRequest(options: {\n agentContext: AgentContext\n pool: IndyVdrPool\n signingKey: Kms.PublicJwk<Kms.Ed25519PublicJwk>\n endorserDid?: string\n unqualifiedDid: string\n endpoints: IndyEndpointAttrib\n }): Promise<AttribRequest> {\n const { agentContext, pool, endpoints, unqualifiedDid, signingKey, endorserDid } = options\n const request = new AttribRequest({\n submitterDid: unqualifiedDid,\n targetDid: unqualifiedDid,\n raw: JSON.stringify({ endpoint: endpoints }),\n })\n\n const writeRequest = await pool.prepareWriteRequest(agentContext, request, signingKey, endorserDid)\n return writeRequest\n }\n\n private async setEndpointsForDid<Request extends IndyVdrRequest>(\n agentContext: AgentContext,\n pool: IndyVdrPool,\n writeRequest: Request\n ): Promise<void> {\n const body = writeRequest.body\n try {\n const response = await pool.submitRequest(writeRequest)\n\n agentContext.config.logger.debug(\n `Successfully set endpoints for did on ledger '${pool.indyNamespace}'.\\nRequest: ${body}}`,\n {\n response,\n }\n )\n } catch (error) {\n agentContext.config.logger.error(\n `Error setting endpoints for did on ledger '${pool.indyNamespace}'.\\nRequest: ${body}}`\n )\n\n throw new IndyVdrError(error)\n }\n }\n}\n\ninterface IndyVdrDidCreateOptionsWithoutDid extends DidCreateOptions {\n didDocument?: never // Not yet supported\n did?: never\n method: 'indy'\n options: {\n /**\n * Optionally an existing keyId can be provided, in this case the did will be created\n * based on the existing key\n */\n keyId?: string\n\n alias?: string\n role?: NymRequestRole\n services?: DidDocumentService[]\n useEndpointAttrib?: boolean\n\n // endorserDid is always required. We just have internal or external mode\n endorserDid: string\n // if endorserMode is 'internal', the endorserDid MUST be present in the wallet\n // if endorserMode is 'external', the endorserDid doesn't have to be present in the wallet\n endorserMode: 'internal' | 'external'\n endorsedTransaction?: never\n }\n}\n\n// When transactions have been endorsed. Only supported for external mode\n// this is a separate interface so we can remove all the properties we don't need anymore.\ninterface IndyVdrDidCreateOptionsForSubmission extends DidCreateOptions {\n didDocument?: never\n did: string // for submission MUST always have a did, so we know which did we're submitting the transaction for. We MUST check whether the did passed here, matches with the\n method?: never\n options: {\n endorserMode: 'external'\n\n // provide the endorsed transactions. If these are provided\n // we will submit the transactions to the ledger\n endorsedTransaction: {\n nymRequest: string\n attribRequest?: string\n }\n }\n}\n\nexport type IndyVdrDidCreateOptions = IndyVdrDidCreateOptionsWithoutDid | IndyVdrDidCreateOptionsForSubmission\n\ntype ParseInputOkEndorsedTransaction = {\n status: 'ok'\n did: string\n type: 'endorsedTransaction'\n endorsedTransaction: IndyVdrDidCreateOptionsForSubmission['options']['endorsedTransaction']\n namespaceIdentifier: string\n namespace: string\n endorserNamespaceIdentifier: string\n}\n\ntype ParseInputOkCreate = {\n status: 'ok'\n type: 'create'\n did: string\n verificationKey: Kms.PublicJwk<Kms.Ed25519PublicJwk>\n namespaceIdentifier: string\n namespace: string\n endorserNamespaceIdentifier: string\n endorserDid: string\n alias?: string\n role?: NymRequestRole\n services?: DidDocumentService[]\n useEndpointAttrib?: boolean\n}\n\ntype parseInputError = { status: 'error'; reason: string }\n\ntype ParseInputResult = ParseInputOkEndorsedTransaction | ParseInputOkCreate | parseInputError\n\nexport interface EndorseDidTxAction extends DidOperationStateActionBase {\n action: 'endorseIndyTransaction'\n endorserDid: string\n nymRequest: string\n attribRequest?: string\n did: string\n}\n\nexport type IndyVdrDidCreateResult = DidCreateResult<EndorseDidTxAction>\n\nexport type NymRequestRole = 'STEWARD' | 'TRUSTEE' | 'ENDORSER' | 'NETWORK_MONITOR'\n"],"mappings":";;;;;;;;;;AAwCA,IAAa,0BAAb,MAA6D;;OAC3C,mBAAmB,CAAC,OAAO;;CAE3C,AAAQ,sBAAsB,EAC5B,WACA,WACA,OAKyB;AACzB,SAAO;GACL,OAAO;GACP,qBAAqB,EAAE;GACvB,yBAAyB,EACvB,kBAAkB,WACnB;GACD,UAAU;GACX;;CAGH,AAAQ,sBAAsB,EAAE,UAAsD;AACpF,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EAAE;GAC3B,UAAU;IACR,OAAO;IACC;IACT;GACF;;CAGH,AAAQ,wBAAwB,EAC9B,KACA,aACA,aAKyB;AACzB,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EACvB,kBAAkB,WACnB;GACD,UAAU;IACR,OAAO;IACP;IACA;IACD;GACF;;CAGH,MAAa,WAAW,cAA4B,SAA6D;AAC/G,MAAI,QAAQ,QAAQ,qBAAqB;AACvC,OAAI,CAAC,QAAQ,OAAO,OAAO,QAAQ,QAAQ,SACzC,QAAO;IACL,QAAQ;IACR,QAAQ;IACT;GAEH,MAAM,EAAE,WAAW,+CAAwB,aAAa,QAAQ,IAAI;GAEpE,MAAMA,gCAA8B,KAAK,MAAM,QAAQ,QAAQ,oBAAoB,WAAW,CAAC;AAE/F,UAAO;IACL,QAAQ;IACR,MAAM;IACN,qBAAqB,QAAQ,QAAQ;IACrC,KAAK,QAAQ;IACb;IACA;IACA;IACD;;EAGH,MAAM,cAAc,QAAQ,QAAQ;EACpC,MAAM,EAAE,WAAW,mBAAmB,qBAAqB,gCAAgC,aAAa,YAAY;EAEpH,MAAM,MAAM,aAAa,kBAAkB,QAAQ,IAAI,iBAAiB;EAExE,MAAM,mBAAmB,QAAQ,QAAQ,QACrC,MAAM,IAAI,aAAa,EAAE,OAAO,QAAQ,QAAQ,OAAO,CAAC,IAEtD,MAAM,IAAI,UAAU,EAClB,MAAM;GACJ,KAAK;GACL,KAAK;GACN,EACF,CAAC,EACF;AAEN,MAAI,iBAAiB,QAAQ,SAAS,iBAAiB,QAAQ,UAC7D,QAAO;GACL,QAAQ;GACR,QAAQ,iDAAiD,IAAI,uBAAuB,iBAAiB;GACtG;EAGH,MAAM,kBAAkB,IAAI,UAAU,cAAc,iBAAiB;EAGrE,MAAM,SAAS,OAAO,KAAK,gBAAgB,UAAU,WAAW,UAAU;EAE1E,MAAM,sBAAsB,kBAAkB,SAAS,OAAO,MAAM,GAAG,GAAG,CAAC;AAG3E,SAAO;GACL,QAAQ;GACR,MAAM;GACN,KALU,YAAY,kBAAkB,GAAG;GAM3C;GACA,aAAa,QAAQ,QAAQ;GAC7B,OAAO,QAAQ,QAAQ;GACvB,MAAM,QAAQ,QAAQ;GACtB,UAAU,QAAQ,QAAQ;GAC1B,mBAAmB,QAAQ,QAAQ;GACnC;GACA,WAAW;GACX;GACD;;CAGH,MAAa,cACX,cACA,KACA,aACA,MACe;EAEf,MAAM,YAAY,IAAI,UAAU;GAC9B;GACA,MAAM,gBAAgB;GACtB;GACA;GACD,CAAC;AAGF,QADsB,aAAa,kBAAkB,QAAQ,cAAc,CACvD,KAAK,cAAc,UAAU;;CAGnD,MAAa,yBAAyB,cAA4B,KAAmC;EAEnG,MAAM,YAAY,MADI,aAAa,kBAAkB,QAAQ,cAAc,CACrC,iBAAiB,cAAc;GACnE;GACA,MAAM,gBAAgB;GACvB,CAAC;AAEF,MAAI,CAAC,UAAU,YACb,OAAM,IAAI,WAAW,uBAAuB,IAAI,wBAAwB;AAG1E,SAAO,UAAU;;CAGnB,AAAQ,kBACN,KACA,iBACA,UACA,mBACA;EACA,MAAM,wBAAwB,kBAAkB,SAAS,gBAAgB,UAAU,UAAU;EAE7F,MAAM,qBAAqB,uBAAuB,KAAK,sBAAsB;EAC7E,IAAIC;AAGJ,MAAI,UAAU;AACZ,QAAK,MAAM,QAAQ,UAAU;IAC3B,MAAM,0BAA0B,OAAe;AAC7C,YAAO,GAAG,WAAW,IAAI,GAAG,GAAG,MAAM,OAAO;;AAI9C,SAAK,KAAK,uBAAuB,KAAK,GAAG;AAGzC,QAAI,gBAAgB,iBAClB,MAAK,gBAAgB,KAAK,cAAc,IAAI,uBAAuB;AAGrE,uBAAmB,WAAW,KAAK;;GAGrC,MAAM,YAAY;IAAC,iBAAiB;IAAM,iBAAiB;IAAM,oBAAoB;IAAM,iBAAiB;IAAK;GACjH,MAAM,eAAe,IAAI,IAAI,SAAS,KAAK,SAAS,KAAK,KAAK,CAAC;GAE/D,MAAM,iBAAiB,GAAG,IAAI;AAG9B,OAAI,UAAU,MAAM,SAAS,aAAa,IAAI,KAAK,CAAC,CAClD,oBACG,WAAW,kDAAkD,CAC7D,sBAAsB;IACrB,YAAY;IACZ,IAAI;IACJ,iBAAiB,sBAAsB,sBAAsB;IAC7D,MAAM;IACP,CAAC,CACD,gBAAgB,eAAe;AAKpC,OAAI,aAAa,IAAI,oBAAoB,KAAK,IAAI,aAAa,IAAI,iBAAiB,KAAK,CACvF,oBAAmB,WAAW,4CAA4C;AAG5E,OAAI,CAAC,kBAEH,iBAAgB,WACd,mBAAmB,OAAO,CAAC,QAAQ,EACnC,uBAAuB,KAAK,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CACpE;;EAKL,MAAM,cAAc,mBAAmB,OAAO;AAE9C,SAAO;GACL;GACA;GACD;;CAKH,MAAa,OAAO,cAA4B,SAAmE;AACjH,MAAI;GACF,MAAM,MAAM,MAAM,KAAK,WAAW,cAAc,QAAQ;AACxD,OAAI,IAAI,WAAW,QAAS,QAAO,KAAK,sBAAsB,EAAE,QAAQ,IAAI,QAAQ,CAAC;GAErF,MAAM,MAAM,IAAI;GAEhB,MAAM,OAAO,aAAa,kBAAkB,QAAQ,mBAAmB,CAAC,oBAAoB,IAAI,UAAU;GAE1G,IAAIC;GACJ,IAAIC;GACJ,IAAIC;GACJ,IAAIC;AAEJ,OAAI,IAAI,SAAS,uBAAuB;IACtC,MAAM,EAAE,YAAY,aAAa,eAAe,mBAAmB,IAAI;AACvE,iBAAa,IAAI,cAAc,EAAE,eAAe,aAAa,CAAC;AAC9D,oBAAgB,iBAAiB,IAAI,cAAc,EAAE,eAAe,gBAAgB,CAAC,GAAG;UACnF;IACL,MAAM,EACJ,UACA,mBACA,OACA,6BACA,qBACA,YACA,MACA,aACA,cACE;AACJ,sBAAkB,IAAI;IAEtB,MAAM,EAAE,aAAa,cAAc,kBAAkB,KAAK,kBACxDC,OACA,iBACA,UACA,kBACD;AACD,kBAAc;IAEd,MAAM,wBACJ,QAAQ,QAAQ,iBAAiB,aAC7B,MAAM,gCAAgC,cAAc,QAAQ,QAAQ,YAAY,GAChF;AAEN,iBAAa,MAAM,KAAK,8BAA8B;KACpD;KACA;KACA,YAAY;KACZ,8BAA8B;KAC9B;KACA;KACA;KACA;KACA;KACD,CAAC;AAEF,QAAI,YAAY,mBAAmB;KACjC,MAAM,YAAY,4BAA4B,SAAS;AACvD,qBAAgB,MAAM,KAAK,6BAA6B;MACtD;MACA;MACA,YAAY;MACZ,aAAa,QAAQ,QAAQ,iBAAiB,aAAa,cAAc;MACzE,gBAAgB;MAChB;MACD,CAAC;;AAGJ,QAAI,QAAQ,QAAQ,iBAAiB,YAAY;AAE/C,WAAM,KAAK,cAAc,cAAcA,OAAK,aAAa,CACvD;MACE,0BAA0B;MAC1B,UAAU,gBAAgB;MAC3B,CACF,CAAC;KACF,MAAMC,YAAgC;MACpC,OAAO;MACP,QAAQ;MACK;MACb,YAAY,WAAW;MACvB,eAAe,eAAe;MAC9B,KAAKD;MACN;AAED,YAAO,KAAK,sBAAsB;MAAE;MAAW;MAAW;MAAK,CAAC;;;AAIpE,SAAM,KAAK,kBAAkB,cAAc,MAAM,WAAW;AAC5D,OAAI,cAAe,OAAM,KAAK,mBAAmB,cAAc,MAAM,cAAc;AAInF,OAAI,mBAAmB,YACrB,OAAM,KAAK,cAAc,cAAc,KAAK,aAAa,CACvD;IACE,0BAA0B;IAC1B,UAAU,gBAAgB;IAC3B,CACF,CAAC;AAGJ,iBAAc,eAAgB,MAAM,KAAK,yBAAyB,cAAc,IAAI;AACpF,UAAO,KAAK,wBAAwB;IAAE;IAAK;IAAa,WAAW,IAAI;IAAW,CAAC;WAC5E,OAAO;AACd,gBAAa,OAAO,OAAO,MAAM,2BAA2B,EAC1D,OACD,CAAC;AACF,UAAO,KAAK,sBAAsB,EAChC,QAAQ,iBAAiB,MAAM,WAChC,CAAC;;;CAIN,MAAa,SAAmC;AAC9C,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EAAE;GAC3B,UAAU;IACR,OAAO;IACP,QAAQ;IACT;GACF;;CAGH,MAAa,aAA2C;AACtD,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EAAE;GAC3B,UAAU;IACR,OAAO;IACP,QAAQ;IACT;GACF;;CAGH,MAAc,8BAA8B,SAUzC;EACD,MAAM,EACJ,cACA,MACA,8BACA,qBACA,iBACA,OACA,YACA,SACE;AAGJ,MAAI,QAAQ,cACV,OAAM,IAAI,aAAa,qCAAqC;EAG9D,MAAM,UAAU,IAAI,WAAW;GAC7B,cAAc;GACd,MAAM;GACN,QAAQ,kBAAkB,SAAS,gBAAgB,UAAU,UAAU;GACvE;GACA;GACD,CAAC;AAEF,MAAI,CAAC,WAAY,QAAO;AAExB,SADqB,MAAM,KAAK,oBAAoB,cAAc,SAAS,YAAY,OAAU;;CAInG,MAAc,kBACZ,cACA,MACA,cACA;EACA,MAAM,OAAO,aAAa;AAC1B,MAAI;GACF,MAAM,WAAW,MAAM,KAAK,cAAc,aAAa;AAEvD,gBAAa,OAAO,OAAO,MAAM,kCAAkC,KAAK,cAAc,cAAc,KAAK,IAAI,EAC3G,UACD,CAAC;AAEF;WACO,OAAO;AACd,gBAAa,OAAO,OAAO,MACzB,2CAA2C,KAAK,cAAc,cAAc,KAAK,GAClF;AAED,SAAM;;;CAIV,MAAc,6BAA6B,SAOhB;EACzB,MAAM,EAAE,cAAc,MAAM,WAAW,gBAAgB,YAAY,gBAAgB;EACnF,MAAM,UAAU,IAAI,cAAc;GAChC,cAAc;GACd,WAAW;GACX,KAAK,KAAK,UAAU,EAAE,UAAU,WAAW,CAAC;GAC7C,CAAC;AAGF,SADqB,MAAM,KAAK,oBAAoB,cAAc,SAAS,YAAY,YAAY;;CAIrG,MAAc,mBACZ,cACA,MACA,cACe;EACf,MAAM,OAAO,aAAa;AAC1B,MAAI;GACF,MAAM,WAAW,MAAM,KAAK,cAAc,aAAa;AAEvD,gBAAa,OAAO,OAAO,MACzB,iDAAiD,KAAK,cAAc,eAAe,KAAK,IACxF,EACE,UACD,CACF;WACM,OAAO;AACd,gBAAa,OAAO,OAAO,MACzB,8CAA8C,KAAK,cAAc,eAAe,KAAK,GACtF;AAED,SAAM,IAAI,aAAa,MAAM"}
@@ -0,0 +1,12 @@
1
+ import { AgentContext, DidResolutionResult, DidResolver } from "@credo-ts/core";
2
+
3
+ //#region src/dids/IndyVdrIndyDidResolver.d.ts
4
+ declare class IndyVdrIndyDidResolver implements DidResolver {
5
+ readonly supportedMethods: string[];
6
+ readonly allowsCaching = true;
7
+ readonly allowsLocalDidRecord = true;
8
+ resolve(agentContext: AgentContext, did: string): Promise<DidResolutionResult>;
9
+ }
10
+ //#endregion
11
+ export { IndyVdrIndyDidResolver };
12
+ //# sourceMappingURL=IndyVdrIndyDidResolver.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndyVdrIndyDidResolver.d.mts","names":[],"sources":["../../src/dids/IndyVdrIndyDidResolver.ts"],"sourcesContent":[],"mappings":";;;cAOa,sBAAA,YAAkC;;EAAlC,SAAA,aAAA,GAAuB,IAAA;EAMC,SAAA,oBAAA,GAAA,IAAA;EAAoC,OAAA,CAAA,YAAA,EAApC,YAAoC,EAAA,GAAA,EAAA,MAAA,CAAA,EAAR,OAAQ,CAAA,mBAAA,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { buildDidDocument } from "./didIndyUtil.mjs";
2
+ import { IndyVdrPoolService } from "../pool/IndyVdrPoolService.mjs";
3
+ import "../pool/index.mjs";
4
+ import { parseIndyDid } from "@credo-ts/anoncreds";
5
+
6
+ //#region src/dids/IndyVdrIndyDidResolver.ts
7
+ var IndyVdrIndyDidResolver = class {
8
+ constructor() {
9
+ this.supportedMethods = ["indy"];
10
+ this.allowsCaching = true;
11
+ this.allowsLocalDidRecord = true;
12
+ }
13
+ async resolve(agentContext, did) {
14
+ const didDocumentMetadata = {};
15
+ try {
16
+ return {
17
+ didDocument: await buildDidDocument(agentContext, agentContext.dependencyManager.resolve(IndyVdrPoolService).getPoolForNamespace(parseIndyDid(did).namespace), did),
18
+ didDocumentMetadata,
19
+ didResolutionMetadata: { contentType: "application/did+ld+json" }
20
+ };
21
+ } catch (error) {
22
+ return {
23
+ didDocument: null,
24
+ didDocumentMetadata,
25
+ didResolutionMetadata: {
26
+ error: "notFound",
27
+ message: `resolver_error: Unable to resolve did '${did}': ${error}`
28
+ }
29
+ };
30
+ }
31
+ }
32
+ };
33
+
34
+ //#endregion
35
+ export { IndyVdrIndyDidResolver };
36
+ //# sourceMappingURL=IndyVdrIndyDidResolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndyVdrIndyDidResolver.mjs","names":[],"sources":["../../src/dids/IndyVdrIndyDidResolver.ts"],"sourcesContent":["import { parseIndyDid } from '@credo-ts/anoncreds'\nimport type { AgentContext, DidResolutionResult, DidResolver } from '@credo-ts/core'\n\nimport { IndyVdrPoolService } from '../pool'\n\nimport { buildDidDocument } from './didIndyUtil'\n\nexport class IndyVdrIndyDidResolver implements DidResolver {\n public readonly supportedMethods = ['indy']\n\n public readonly allowsCaching = true\n public readonly allowsLocalDidRecord = true\n\n public async resolve(agentContext: AgentContext, did: string): Promise<DidResolutionResult> {\n const didDocumentMetadata = {}\n try {\n const poolService = agentContext.dependencyManager.resolve(IndyVdrPoolService)\n const pool = poolService.getPoolForNamespace(parseIndyDid(did).namespace)\n\n // Get DID Document from Get NYM response\n const didDocument = await buildDidDocument(agentContext, pool, did)\n\n return {\n didDocument,\n didDocumentMetadata,\n didResolutionMetadata: { contentType: 'application/did+ld+json' },\n }\n } catch (error) {\n return {\n didDocument: null,\n didDocumentMetadata,\n didResolutionMetadata: {\n error: 'notFound',\n message: `resolver_error: Unable to resolve did '${did}': ${error}`,\n },\n }\n }\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,yBAAb,MAA2D;;OACzC,mBAAmB,CAAC,OAAO;OAE3B,gBAAgB;OAChB,uBAAuB;;CAEvC,MAAa,QAAQ,cAA4B,KAA2C;EAC1F,MAAM,sBAAsB,EAAE;AAC9B,MAAI;AAOF,UAAO;IACL,aAHkB,MAAM,iBAAiB,cAJvB,aAAa,kBAAkB,QAAQ,mBAAmB,CACrD,oBAAoB,aAAa,IAAI,CAAC,UAAU,EAGV,IAAI;IAIjE;IACA,uBAAuB,EAAE,aAAa,2BAA2B;IAClE;WACM,OAAO;AACd,UAAO;IACL,aAAa;IACb;IACA,uBAAuB;KACrB,OAAO;KACP,SAAS,0CAA0C,IAAI,KAAK;KAC7D;IACF"}
@@ -0,0 +1,13 @@
1
+ import { AgentContext, DidResolutionResult, DidResolver, ParsedDid } from "@credo-ts/core";
2
+
3
+ //#region src/dids/IndyVdrSovDidResolver.d.ts
4
+ declare class IndyVdrSovDidResolver implements DidResolver {
5
+ readonly supportedMethods: string[];
6
+ readonly allowsCaching = true;
7
+ resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise<DidResolutionResult>;
8
+ private getPublicDid;
9
+ private getEndpointsForDid;
10
+ }
11
+ //#endregion
12
+ export { IndyVdrSovDidResolver };
13
+ //# sourceMappingURL=IndyVdrSovDidResolver.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndyVdrSovDidResolver.d.mts","names":[],"sources":["../../src/dids/IndyVdrSovDidResolver.ts"],"sourcesContent":[],"mappings":";;;cASa,qBAAA,YAAiC;;EAAjC,SAAA,aAAA,GAAsB,IAAA;EAKE,OAAA,CAAA,YAAA,EAAA,YAAA,EAAA,GAAA,EAAA,MAAA,EAAA,MAAA,EAAmC,SAAnC,CAAA,EAA+C,OAA/C,CAAuD,mBAAvD,CAAA;EAAmC,QAAA,YAAA;EAAoB,QAAA,kBAAA"}
@@ -0,0 +1,70 @@
1
+ import { IndyVdrError } from "../error/IndyVdrError.mjs";
2
+ import { IndyVdrNotFoundError } from "../error/IndyVdrNotFound.mjs";
3
+ import "../error/index.mjs";
4
+ import { addServicesFromEndpointsAttrib, sovDidDocumentFromDid } from "./didSovUtil.mjs";
5
+ import { IndyVdrPoolService } from "../pool/IndyVdrPoolService.mjs";
6
+ import { GetAttribRequest, GetNymRequest } from "@hyperledger/indy-vdr-shared";
7
+
8
+ //#region src/dids/IndyVdrSovDidResolver.ts
9
+ var IndyVdrSovDidResolver = class {
10
+ constructor() {
11
+ this.supportedMethods = ["sov"];
12
+ this.allowsCaching = true;
13
+ }
14
+ async resolve(agentContext, did, parsed) {
15
+ const didDocumentMetadata = {};
16
+ try {
17
+ const { pool } = await agentContext.dependencyManager.resolve(IndyVdrPoolService).getPoolForDid(agentContext, parsed.id);
18
+ const nym = await this.getPublicDid(pool, parsed.id);
19
+ const endpoints = await this.getEndpointsForDid(agentContext, pool, parsed.id);
20
+ const keyAgreementId = `${parsed.did}#key-agreement-1`;
21
+ const builder = sovDidDocumentFromDid(parsed.did, nym.verkey);
22
+ if (endpoints) addServicesFromEndpointsAttrib(builder, parsed.did, endpoints, keyAgreementId);
23
+ return {
24
+ didDocument: builder.build(),
25
+ didDocumentMetadata,
26
+ didResolutionMetadata: { contentType: "application/did+ld+json" }
27
+ };
28
+ } catch (error) {
29
+ return {
30
+ didDocument: null,
31
+ didDocumentMetadata,
32
+ didResolutionMetadata: {
33
+ error: "notFound",
34
+ message: `resolver_error: Unable to resolve did '${did}': ${error}`
35
+ }
36
+ };
37
+ }
38
+ }
39
+ async getPublicDid(pool, unqualifiedDid) {
40
+ const request = new GetNymRequest({ dest: unqualifiedDid });
41
+ const didResponse = await pool.submitRequest(request);
42
+ if (!didResponse.result.data) throw new IndyVdrNotFoundError(`DID ${unqualifiedDid} not found`);
43
+ return JSON.parse(didResponse.result.data);
44
+ }
45
+ async getEndpointsForDid(agentContext, pool, did) {
46
+ try {
47
+ agentContext.config.logger.debug(`Get endpoints for did '${did}' from ledger '${pool.indyNamespace}'`);
48
+ const request = new GetAttribRequest({
49
+ targetDid: did,
50
+ raw: "endpoint"
51
+ });
52
+ agentContext.config.logger.debug(`Submitting get endpoint ATTRIB request for did '${did}' to ledger '${pool.indyNamespace}'`);
53
+ const response = await pool.submitRequest(request);
54
+ if (!response.result.data) return null;
55
+ const endpoints = JSON.parse(response.result.data)?.endpoint;
56
+ agentContext.config.logger.debug(`Got endpoints '${JSON.stringify(endpoints)}' for did '${did}' from ledger '${pool.indyNamespace}'`, {
57
+ response,
58
+ endpoints
59
+ });
60
+ return endpoints ?? null;
61
+ } catch (error) {
62
+ agentContext.config.logger.error(`Error retrieving endpoints for did '${did}' from ledger '${pool.indyNamespace}'`, { error });
63
+ throw new IndyVdrError(error);
64
+ }
65
+ }
66
+ };
67
+
68
+ //#endregion
69
+ export { IndyVdrSovDidResolver };
70
+ //# sourceMappingURL=IndyVdrSovDidResolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndyVdrSovDidResolver.mjs","names":[],"sources":["../../src/dids/IndyVdrSovDidResolver.ts"],"sourcesContent":["import type { AgentContext, DidResolutionResult, DidResolver, ParsedDid } from '@credo-ts/core'\nimport { GetAttribRequest, GetNymRequest } from '@hyperledger/indy-vdr-shared'\nimport { IndyVdrError, IndyVdrNotFoundError } from '../error'\nimport type { IndyVdrPool } from '../pool'\nimport { IndyVdrPoolService } from '../pool/IndyVdrPoolService'\nimport type { GetNymResponseData, IndyEndpointAttrib } from './didSovUtil'\n\nimport { addServicesFromEndpointsAttrib, sovDidDocumentFromDid } from './didSovUtil'\n\nexport class IndyVdrSovDidResolver implements DidResolver {\n public readonly supportedMethods = ['sov']\n\n public readonly allowsCaching = true\n\n public async resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise<DidResolutionResult> {\n const didDocumentMetadata = {}\n\n try {\n const indyVdrPoolService = agentContext.dependencyManager.resolve(IndyVdrPoolService)\n\n // FIXME: this actually fetches the did twice (if not cached), once for the pool and once for the nym\n // we do not store the diddocContent in the pool cache currently so we need to fetch it again\n // The logic is mostly to determine which pool to use for a did\n const { pool } = await indyVdrPoolService.getPoolForDid(agentContext, parsed.id)\n const nym = await this.getPublicDid(pool, parsed.id)\n const endpoints = await this.getEndpointsForDid(agentContext, pool, parsed.id)\n\n const keyAgreementId = `${parsed.did}#key-agreement-1`\n const builder = sovDidDocumentFromDid(parsed.did, nym.verkey)\n\n if (endpoints) {\n addServicesFromEndpointsAttrib(builder, parsed.did, endpoints, keyAgreementId)\n }\n\n return {\n didDocument: builder.build(),\n didDocumentMetadata,\n didResolutionMetadata: { contentType: 'application/did+ld+json' },\n }\n } catch (error) {\n return {\n didDocument: null,\n didDocumentMetadata,\n didResolutionMetadata: {\n error: 'notFound',\n message: `resolver_error: Unable to resolve did '${did}': ${error}`,\n },\n }\n }\n }\n\n private async getPublicDid(pool: IndyVdrPool, unqualifiedDid: string) {\n const request = new GetNymRequest({ dest: unqualifiedDid })\n const didResponse = await pool.submitRequest(request)\n\n if (!didResponse.result.data) {\n throw new IndyVdrNotFoundError(`DID ${unqualifiedDid} not found`)\n }\n return JSON.parse(didResponse.result.data) as GetNymResponseData\n }\n\n private async getEndpointsForDid(agentContext: AgentContext, pool: IndyVdrPool, did: string) {\n try {\n agentContext.config.logger.debug(`Get endpoints for did '${did}' from ledger '${pool.indyNamespace}'`)\n\n const request = new GetAttribRequest({ targetDid: did, raw: 'endpoint' })\n\n agentContext.config.logger.debug(\n `Submitting get endpoint ATTRIB request for did '${did}' to ledger '${pool.indyNamespace}'`\n )\n const response = await pool.submitRequest(request)\n\n if (!response.result.data) {\n return null\n }\n\n const endpoints = JSON.parse(response.result.data as string)?.endpoint as IndyEndpointAttrib\n agentContext.config.logger.debug(\n `Got endpoints '${JSON.stringify(endpoints)}' for did '${did}' from ledger '${pool.indyNamespace}'`,\n {\n response,\n endpoints,\n }\n )\n\n return endpoints ?? null\n } catch (error) {\n agentContext.config.logger.error(\n `Error retrieving endpoints for did '${did}' from ledger '${pool.indyNamespace}'`,\n {\n error,\n }\n )\n\n throw new IndyVdrError(error)\n }\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAa,wBAAb,MAA0D;;OACxC,mBAAmB,CAAC,MAAM;OAE1B,gBAAgB;;CAEhC,MAAa,QAAQ,cAA4B,KAAa,QAAiD;EAC7G,MAAM,sBAAsB,EAAE;AAE9B,MAAI;GAMF,MAAM,EAAE,SAAS,MALU,aAAa,kBAAkB,QAAQ,mBAAmB,CAK3C,cAAc,cAAc,OAAO,GAAG;GAChF,MAAM,MAAM,MAAM,KAAK,aAAa,MAAM,OAAO,GAAG;GACpD,MAAM,YAAY,MAAM,KAAK,mBAAmB,cAAc,MAAM,OAAO,GAAG;GAE9E,MAAM,iBAAiB,GAAG,OAAO,IAAI;GACrC,MAAM,UAAU,sBAAsB,OAAO,KAAK,IAAI,OAAO;AAE7D,OAAI,UACF,gCAA+B,SAAS,OAAO,KAAK,WAAW,eAAe;AAGhF,UAAO;IACL,aAAa,QAAQ,OAAO;IAC5B;IACA,uBAAuB,EAAE,aAAa,2BAA2B;IAClE;WACM,OAAO;AACd,UAAO;IACL,aAAa;IACb;IACA,uBAAuB;KACrB,OAAO;KACP,SAAS,0CAA0C,IAAI,KAAK;KAC7D;IACF;;;CAIL,MAAc,aAAa,MAAmB,gBAAwB;EACpE,MAAM,UAAU,IAAI,cAAc,EAAE,MAAM,gBAAgB,CAAC;EAC3D,MAAM,cAAc,MAAM,KAAK,cAAc,QAAQ;AAErD,MAAI,CAAC,YAAY,OAAO,KACtB,OAAM,IAAI,qBAAqB,OAAO,eAAe,YAAY;AAEnE,SAAO,KAAK,MAAM,YAAY,OAAO,KAAK;;CAG5C,MAAc,mBAAmB,cAA4B,MAAmB,KAAa;AAC3F,MAAI;AACF,gBAAa,OAAO,OAAO,MAAM,0BAA0B,IAAI,iBAAiB,KAAK,cAAc,GAAG;GAEtG,MAAM,UAAU,IAAI,iBAAiB;IAAE,WAAW;IAAK,KAAK;IAAY,CAAC;AAEzE,gBAAa,OAAO,OAAO,MACzB,mDAAmD,IAAI,eAAe,KAAK,cAAc,GAC1F;GACD,MAAM,WAAW,MAAM,KAAK,cAAc,QAAQ;AAElD,OAAI,CAAC,SAAS,OAAO,KACnB,QAAO;GAGT,MAAM,YAAY,KAAK,MAAM,SAAS,OAAO,KAAe,EAAE;AAC9D,gBAAa,OAAO,OAAO,MACzB,kBAAkB,KAAK,UAAU,UAAU,CAAC,aAAa,IAAI,iBAAiB,KAAK,cAAc,IACjG;IACE;IACA;IACD,CACF;AAED,UAAO,aAAa;WACb,OAAO;AACd,gBAAa,OAAO,OAAO,MACzB,uCAAuC,IAAI,iBAAiB,KAAK,cAAc,IAC/E,EACE,OACD,CACF;AAED,SAAM,IAAI,aAAa,MAAM"}
@@ -0,0 +1,147 @@
1
+ import { IndyVdrError } from "../error/IndyVdrError.mjs";
2
+ import { IndyVdrNotFoundError } from "../error/IndyVdrNotFound.mjs";
3
+ import "../error/index.mjs";
4
+ import { addServicesFromEndpointsAttrib, getFullVerkey } from "./didSovUtil.mjs";
5
+ import { parseIndyDid } from "@credo-ts/anoncreds";
6
+ import { CredoError, DidDocument, DidDocumentBuilder, DidsApi, Hasher, JsonTransformer, Kms, TypedArrayEncoder, convertPublicKeyToX25519, getPublicJwkFromVerificationMethod } from "@credo-ts/core";
7
+ import { GetAttribRequest, GetNymRequest } from "@hyperledger/indy-vdr-shared";
8
+
9
+ //#region src/dids/didIndyUtil.ts
10
+ function indyDidDocumentFromDid(did, verKeyBase58) {
11
+ const verificationMethodId = `${did}#verkey`;
12
+ const publicKeyBase58 = verKeyBase58;
13
+ return new DidDocumentBuilder(did).addContext("https://w3id.org/security/suites/ed25519-2018/v1").addVerificationMethod({
14
+ controller: did,
15
+ id: verificationMethodId,
16
+ publicKeyBase58,
17
+ type: "Ed25519VerificationKey2018"
18
+ }).addAuthentication(verificationMethodId);
19
+ }
20
+ function createKeyAgreementKey(verkey) {
21
+ return TypedArrayEncoder.toBase58(convertPublicKeyToX25519(TypedArrayEncoder.fromBase58(verkey)));
22
+ }
23
+ const deepMerge = (a, b) => {
24
+ const output = {};
25
+ for (const key of [...new Set([...Object.keys(a), ...Object.keys(b)])]) if (a[key] && !b[key]) output[key] = a[key];
26
+ else if (!a[key] && b[key]) output[key] = b[key];
27
+ else if (Array.isArray(a[key])) if (Array.isArray(b[key])) {
28
+ const element = /* @__PURE__ */ new Set();
29
+ for (const item of a[key]) element.add(item);
30
+ for (const item of b[key]) element.add(item);
31
+ output[key] = Array.from(element);
32
+ } else {
33
+ const arr = a[key];
34
+ output[key] = Array.from(new Set(...arr, b[key]));
35
+ }
36
+ else if (Array.isArray(b[key])) {
37
+ const arr = b[key];
38
+ output[key] = Array.from(new Set(...arr, a[key]));
39
+ } else if (typeof a[key] === "object" && typeof b[key] === "object") output[key] = deepMerge(a, b);
40
+ return output;
41
+ };
42
+ /**
43
+ * Combine a JSON content with the contents of a DidDocument
44
+ * @param didDoc object containing original DIDDocument
45
+ * @param json object containing extra DIDDoc contents
46
+ *
47
+ * @returns a DidDocument object resulting from the combination of both
48
+ */
49
+ function combineDidDocumentWithJson(didDoc, json) {
50
+ const combinedJson = deepMerge(didDoc.toJSON(), json);
51
+ return JsonTransformer.fromJSON(combinedJson, DidDocument);
52
+ }
53
+ /**
54
+ * Processes the difference between a base DidDocument and a complete DidDocument
55
+ *
56
+ * Note: it does deep comparison based only on "id" field to determine whether is
57
+ * the same object or is a different one
58
+ *
59
+ * @param extra complete DidDocument
60
+ * @param base base DidDocument
61
+ * @returns diff object
62
+ */
63
+ function didDocDiff(extra, base) {
64
+ const output = {};
65
+ for (const key in extra) if (!(key in base)) output[key] = extra[key];
66
+ else if (Array.isArray(extra[key]) && Array.isArray(base[key])) {
67
+ output[key] = [];
68
+ const baseAsArray = base[key];
69
+ const extraAsArray = extra[key];
70
+ for (const element of extraAsArray) if (!baseAsArray.find((item) => item.id === element.id)) output[key].push(element);
71
+ } else if (typeof extra[key] === "object" && typeof base[key] === "object") output[key] = didDocDiff(extra[key], base[key]);
72
+ else output[key] = extra[key];
73
+ return output;
74
+ }
75
+ /**
76
+ * Fetches the verification key for a given did:indy did and returns the key as a {@link Key} object.
77
+ *
78
+ * @throws {@link CredoError} if the did could not be resolved or the key could not be extracted
79
+ */
80
+ async function verificationPublicJwkForIndyDid(agentContext, did) {
81
+ const { keys, didDocument } = await agentContext.dependencyManager.resolve(DidsApi).resolveCreatedDidDocumentWithKeys(did);
82
+ const verificationMethod = didDocument.dereferenceKey("#verkey");
83
+ const key = keys?.find((key$1) => key$1.didDocumentRelativeKeyId === "#verkey");
84
+ const publicJwk = getPublicJwkFromVerificationMethod(verificationMethod);
85
+ if (!publicJwk.is(Kms.Ed25519PublicJwk)) throw new CredoError("Expected #verkey verification mehod to be of type Ed25519");
86
+ publicJwk.keyId = key?.kmsKeyId ?? publicJwk.legacyKeyId;
87
+ return publicJwk;
88
+ }
89
+ async function getPublicDid(pool, unqualifiedDid) {
90
+ const request = new GetNymRequest({ dest: unqualifiedDid });
91
+ const didResponse = await pool.submitRequest(request);
92
+ if (!didResponse.result.data) throw new IndyVdrNotFoundError(`DID ${unqualifiedDid} not found in indy namespace ${pool.indyNamespace}`);
93
+ return JSON.parse(didResponse.result.data);
94
+ }
95
+ async function getEndpointsForDid(agentContext, pool, unqualifiedDid) {
96
+ try {
97
+ agentContext.config.logger.debug(`Get endpoints for did '${unqualifiedDid}' from ledger '${pool.indyNamespace}'`);
98
+ const request = new GetAttribRequest({
99
+ targetDid: unqualifiedDid,
100
+ raw: "endpoint"
101
+ });
102
+ agentContext.config.logger.debug(`Submitting get endpoint ATTRIB request for did '${unqualifiedDid}' to ledger '${pool.indyNamespace}'`);
103
+ const response = await pool.submitRequest(request);
104
+ if (!response.result.data) return null;
105
+ const endpoints = JSON.parse(response.result.data)?.endpoint;
106
+ agentContext.config.logger.debug(`Got endpoints '${JSON.stringify(endpoints)}' for did '${unqualifiedDid}' from ledger '${pool.indyNamespace}'`, {
107
+ response,
108
+ endpoints
109
+ });
110
+ return endpoints;
111
+ } catch (error) {
112
+ agentContext.config.logger.error(`Error retrieving endpoints for did '${unqualifiedDid}' from ledger '${pool.indyNamespace}'`, { error });
113
+ throw new IndyVdrError(error);
114
+ }
115
+ }
116
+ async function buildDidDocument(agentContext, pool, did) {
117
+ const { namespaceIdentifier } = parseIndyDid(did);
118
+ const nym = await getPublicDid(pool, namespaceIdentifier);
119
+ const verkey = getFullVerkey(namespaceIdentifier, nym.verkey);
120
+ const builder = indyDidDocumentFromDid(did, verkey);
121
+ if (!nym.diddocContent) {
122
+ const keyAgreementId = `${did}#key-agreement-1`;
123
+ const endpoints = await getEndpointsForDid(agentContext, pool, namespaceIdentifier);
124
+ if (endpoints) {
125
+ builder.addContext("https://w3id.org/security/suites/x25519-2019/v1").addVerificationMethod({
126
+ controller: did,
127
+ id: keyAgreementId,
128
+ publicKeyBase58: createKeyAgreementKey(verkey),
129
+ type: "X25519KeyAgreementKey2019"
130
+ }).addKeyAgreement(keyAgreementId);
131
+ addServicesFromEndpointsAttrib(builder, did, endpoints, keyAgreementId);
132
+ }
133
+ return builder.build();
134
+ }
135
+ let diddocContent;
136
+ try {
137
+ diddocContent = JSON.parse(nym.diddocContent);
138
+ } catch (error) {
139
+ agentContext.config.logger.error(`Nym diddocContent is not a valid json string: ${nym.diddocContent}`);
140
+ throw new IndyVdrError(`Nym diddocContent failed to parse as JSON: ${error}`);
141
+ }
142
+ return combineDidDocumentWithJson(builder.build(), diddocContent);
143
+ }
144
+
145
+ //#endregion
146
+ export { buildDidDocument, createKeyAgreementKey, didDocDiff, indyDidDocumentFromDid, verificationPublicJwkForIndyDid };
147
+ //# sourceMappingURL=didIndyUtil.mjs.map