@twin.org/identity-service 0.9.2-next.3 → 0.9.2-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/identityRoutes.js +2 -2
- package/dist/es/identityRoutes.js.map +1 -1
- package/dist/es/identityService.js +75 -85
- package/dist/es/identityService.js.map +1 -1
- package/dist/es/models/IIdentityServiceConfig.js.map +1 -1
- package/dist/es/models/IIdentityServiceConstructorOptions.js.map +1 -1
- package/dist/types/identityService.d.ts +18 -13
- package/dist/types/models/IIdentityServiceConfig.d.ts +0 -5
- package/dist/types/models/IIdentityServiceConstructorOptions.d.ts +5 -0
- package/docs/changelog.md +33 -0
- package/docs/open-api/spec.json +18 -0
- package/docs/reference/classes/IdentityService.md +38 -33
- package/docs/reference/interfaces/IIdentityServiceConfig.md +0 -14
- package/docs/reference/interfaces/IIdentityServiceConstructorOptions.md +14 -0
- package/package.json +5 -4
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
import { HealthCategory, HealthStatus } from "@twin.org/api-models";
|
|
4
4
|
import { ContextIdKeys, ContextIdStore } from "@twin.org/context";
|
|
5
5
|
import { BaseError, ComponentFactory, GeneralError, Guards, Is, Urn } from "@twin.org/core";
|
|
6
|
+
import { AccountHelper } from "@twin.org/dlt-account";
|
|
6
7
|
import { DocumentHelper, IdentityConnectorFactory, IdentityMetricIds, IdentityMetrics, IdentityResolverConnectorFactory } from "@twin.org/identity-models";
|
|
7
8
|
import { DidVerificationMethodType, ProofTypes } from "@twin.org/standards-w3c-did";
|
|
8
9
|
import { MetricHelper } from "@twin.org/telemetry-models";
|
|
10
|
+
import { VaultConnectorFactory } from "@twin.org/vault-models";
|
|
9
11
|
import { Jwt } from "@twin.org/web";
|
|
10
12
|
/**
|
|
11
13
|
* Class which implements the identity contract.
|
|
@@ -21,25 +23,15 @@ export class IdentityService {
|
|
|
21
23
|
*/
|
|
22
24
|
_defaultNamespace;
|
|
23
25
|
/**
|
|
24
|
-
* The
|
|
25
|
-
* @internal
|
|
26
|
-
*/
|
|
27
|
-
_telemetryComponent;
|
|
28
|
-
/**
|
|
29
|
-
* Cached result of the most recent application-level health check.
|
|
26
|
+
* The vault connector type used for mnemonic migration during health check init.
|
|
30
27
|
* @internal
|
|
31
28
|
*/
|
|
32
|
-
|
|
29
|
+
_vaultConnector;
|
|
33
30
|
/**
|
|
34
|
-
*
|
|
35
|
-
* @internal
|
|
36
|
-
*/
|
|
37
|
-
_lastHealthTime;
|
|
38
|
-
/**
|
|
39
|
-
* Minimum interval in ms between full application-level health checks.
|
|
31
|
+
* The telemetry component.
|
|
40
32
|
* @internal
|
|
41
33
|
*/
|
|
42
|
-
|
|
34
|
+
_telemetryComponent;
|
|
43
35
|
/**
|
|
44
36
|
* Create a new instance of IdentityService.
|
|
45
37
|
* @param options The options for the service.
|
|
@@ -51,8 +43,7 @@ export class IdentityService {
|
|
|
51
43
|
throw new GeneralError(IdentityService.CLASS_NAME, "noConnectors");
|
|
52
44
|
}
|
|
53
45
|
this._defaultNamespace = options?.config?.defaultNamespace ?? names[0];
|
|
54
|
-
this.
|
|
55
|
-
this._healthInterval = options?.config?.healthIntervalMs ?? 300_000;
|
|
46
|
+
this._vaultConnector = VaultConnectorFactory.get(options?.vaultConnectorType ?? "vault");
|
|
56
47
|
this._telemetryComponent = ComponentFactory.getIfExists(options?.telemetryComponentType);
|
|
57
48
|
}
|
|
58
49
|
/**
|
|
@@ -73,16 +64,13 @@ export class IdentityService {
|
|
|
73
64
|
await MetricHelper.createMetrics(this._telemetryComponent, IdentityMetrics);
|
|
74
65
|
}
|
|
75
66
|
/**
|
|
76
|
-
* Creates a temporary DID document for the health check
|
|
77
|
-
* Skipped when called within the configured health interval.
|
|
78
|
-
* @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.
|
|
67
|
+
* Creates a temporary DID document for the application health check.
|
|
79
68
|
* @param contextIds The context IDs accumulated by prior init steps.
|
|
80
69
|
*/
|
|
81
|
-
async
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const controller = contextIds[ContextIdKeys.Node];
|
|
70
|
+
async healthApplicationInit(contextIds) {
|
|
71
|
+
// The wallet service has already setup a temporary controller DID mnemonic for the health check
|
|
72
|
+
// so we can use that to create a new document and add a verification method to it.
|
|
73
|
+
const controller = contextIds[ContextIdKeys.Organization];
|
|
86
74
|
if (!Is.stringValue(controller)) {
|
|
87
75
|
return;
|
|
88
76
|
}
|
|
@@ -90,95 +78,93 @@ export class IdentityService {
|
|
|
90
78
|
const connector = this.getConnectorByNamespace();
|
|
91
79
|
const doc = await connector.createDocument(controller);
|
|
92
80
|
await connector.addVerificationMethod(controller, doc.id, DidVerificationMethodType.AssertionMethod, "health-assertion");
|
|
81
|
+
// The original seed/mnemonic/keys were created with the temp orgId
|
|
82
|
+
// so we need to migrate them to the new document id so that the health check can resolve the DID.
|
|
83
|
+
await AccountHelper.renameAccountKeys(undefined, this._vaultConnector, controller, doc.id);
|
|
84
|
+
// Replace the updated contextIds with the new document id for the health check.
|
|
93
85
|
contextIds[ContextIdKeys.Organization] = doc.id;
|
|
94
86
|
}
|
|
95
|
-
catch
|
|
96
|
-
this._lastAppHealthResult = {
|
|
97
|
-
source: IdentityService.CLASS_NAME,
|
|
98
|
-
category: HealthCategory.Application,
|
|
99
|
-
status: HealthStatus.Error,
|
|
100
|
-
description: "healthDescription",
|
|
101
|
-
message: "createDocumentFailed",
|
|
102
|
-
error: BaseError.fromError(error)
|
|
103
|
-
};
|
|
104
|
-
}
|
|
87
|
+
catch { }
|
|
105
88
|
}
|
|
106
89
|
/**
|
|
107
90
|
* Returns the application health status of the identity service by resolving the DID created
|
|
108
|
-
* in
|
|
109
|
-
* @param
|
|
91
|
+
* in healthApplicationInit.
|
|
92
|
+
* @param callback Callback for deferred results.
|
|
110
93
|
* @returns The health status of the service.
|
|
111
94
|
*/
|
|
112
|
-
async
|
|
95
|
+
async healthApplication(callback) {
|
|
113
96
|
const contextIds = (await ContextIdStore.getContextIds()) ?? {};
|
|
114
97
|
const orgDid = contextIds[ContextIdKeys.Organization];
|
|
115
|
-
if (Is.stringValue(orgDid)) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
98
|
+
if (!Is.stringValue(orgDid)) {
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
source: IdentityService.CLASS_NAME,
|
|
102
|
+
category: HealthCategory.Application,
|
|
103
|
+
status: HealthStatus.Error,
|
|
104
|
+
description: "healthDescription",
|
|
105
|
+
message: "createDocumentFailed",
|
|
106
|
+
data: {
|
|
107
|
+
did: orgDid
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const resolverConnector = IdentityResolverConnectorFactory.getIfExists(this._defaultNamespace);
|
|
114
|
+
if (!Is.undefined(resolverConnector)) {
|
|
115
|
+
const resolved = await resolverConnector.resolveDocument(orgDid);
|
|
116
|
+
return [
|
|
117
|
+
{
|
|
121
118
|
source: IdentityService.CLASS_NAME,
|
|
122
119
|
category: HealthCategory.Application,
|
|
123
120
|
status: Is.object(resolved) ? HealthStatus.Ok : HealthStatus.Error,
|
|
124
121
|
description: "healthDescription",
|
|
125
122
|
message: Is.object(resolved) ? undefined : "resolveDocumentFailed",
|
|
126
|
-
data: {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
this._lastAppHealthResult = {
|
|
133
|
-
source: IdentityService.CLASS_NAME,
|
|
134
|
-
category: HealthCategory.Application,
|
|
135
|
-
status: HealthStatus.Ok,
|
|
136
|
-
description: "healthDescription",
|
|
137
|
-
data: {
|
|
138
|
-
did: orgDid
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
}
|
|
123
|
+
data: { did: orgDid }
|
|
124
|
+
}
|
|
125
|
+
];
|
|
142
126
|
}
|
|
143
|
-
|
|
144
|
-
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
source: IdentityService.CLASS_NAME,
|
|
130
|
+
category: HealthCategory.Application,
|
|
131
|
+
status: HealthStatus.Ok,
|
|
132
|
+
description: "healthDescription",
|
|
133
|
+
data: { did: orgDid }
|
|
134
|
+
}
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return [
|
|
139
|
+
{
|
|
145
140
|
source: IdentityService.CLASS_NAME,
|
|
146
141
|
category: HealthCategory.Application,
|
|
147
142
|
status: HealthStatus.Error,
|
|
148
143
|
description: "healthDescription",
|
|
149
144
|
message: "resolveDocumentFailed",
|
|
150
|
-
data: {
|
|
151
|
-
did: orgDid
|
|
152
|
-
},
|
|
145
|
+
data: { did: orgDid },
|
|
153
146
|
error: BaseError.fromError(error)
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
this._lastHealthTime = lastTimestamp > 0 ? lastTimestamp : Date.now();
|
|
158
|
-
const results = [];
|
|
159
|
-
if (!Is.undefined(this._lastAppHealthResult)) {
|
|
160
|
-
results.push(this._lastAppHealthResult);
|
|
147
|
+
}
|
|
148
|
+
];
|
|
161
149
|
}
|
|
162
|
-
return results;
|
|
163
150
|
}
|
|
164
151
|
/**
|
|
165
|
-
* Removes the DID document created in
|
|
166
|
-
* @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.
|
|
152
|
+
* Removes the DID document created in healthApplicationInit.
|
|
167
153
|
*/
|
|
168
|
-
async
|
|
154
|
+
async healthApplicationTeardown() {
|
|
169
155
|
const contextIds = await ContextIdStore.getContextIds();
|
|
170
|
-
const nodeId = contextIds?.[ContextIdKeys.Node];
|
|
171
156
|
const orgId = contextIds?.[ContextIdKeys.Organization];
|
|
172
|
-
if (!Is.stringValue(orgId)
|
|
157
|
+
if (!Is.stringValue(orgId)) {
|
|
173
158
|
return;
|
|
174
159
|
}
|
|
175
160
|
try {
|
|
176
161
|
const connector = this.getConnectorByNamespace();
|
|
177
|
-
await connector.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
162
|
+
await connector.removeVerificationMethod(orgId, `${orgId}#health-assertion`, {
|
|
163
|
+
removeKeys: true
|
|
164
|
+
});
|
|
165
|
+
await connector.removeDocument(orgId, orgId);
|
|
181
166
|
}
|
|
167
|
+
catch { }
|
|
182
168
|
}
|
|
183
169
|
/**
|
|
184
170
|
* Create a new identity.
|
|
@@ -203,15 +189,17 @@ export class IdentityService {
|
|
|
203
189
|
/**
|
|
204
190
|
* Remove an identity.
|
|
205
191
|
* @param identity The id of the document to remove.
|
|
192
|
+
* @param options Optional settings.
|
|
193
|
+
* @param options.removeKeys Also remove any associated private keys from the vault.
|
|
206
194
|
* @param controller The controller of the identity who can make changes.
|
|
207
195
|
* @returns A promise that resolves when the identity has been removed.
|
|
208
196
|
*/
|
|
209
|
-
async identityRemove(identity, controller) {
|
|
197
|
+
async identityRemove(identity, options, controller) {
|
|
210
198
|
Guards.stringValue(IdentityService.CLASS_NAME, "identity", identity);
|
|
211
199
|
Guards.stringValue(IdentityService.CLASS_NAME, "controller", controller);
|
|
212
200
|
try {
|
|
213
201
|
const identityConnector = this.getConnectorByUri(identity);
|
|
214
|
-
const result = await identityConnector.removeDocument(controller, identity);
|
|
202
|
+
const result = await identityConnector.removeDocument(controller, identity, options);
|
|
215
203
|
await MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.DidsRemoved);
|
|
216
204
|
return result;
|
|
217
205
|
}
|
|
@@ -245,18 +233,20 @@ export class IdentityService {
|
|
|
245
233
|
/**
|
|
246
234
|
* Remove a verification method from the document.
|
|
247
235
|
* @param verificationMethodId The id of the verification method.
|
|
236
|
+
* @param options Optional settings.
|
|
237
|
+
* @param options.removeKeys Also remove any associated private key from the vault.
|
|
248
238
|
* @param controller The controller of the identity who can make changes.
|
|
249
239
|
* @returns A promise that resolves when the verification method has been removed.
|
|
250
240
|
* @throws NotFoundError if the id can not be resolved.
|
|
251
241
|
* @throws NotSupportedError if the platform does not support multiple revocable keys.
|
|
252
242
|
*/
|
|
253
|
-
async verificationMethodRemove(verificationMethodId, controller) {
|
|
243
|
+
async verificationMethodRemove(verificationMethodId, options, controller) {
|
|
254
244
|
Guards.stringValue(IdentityService.CLASS_NAME, "controller", controller);
|
|
255
245
|
Urn.guard(IdentityService.CLASS_NAME, "verificationMethodId", verificationMethodId);
|
|
256
246
|
try {
|
|
257
247
|
const idParts = DocumentHelper.parseId(verificationMethodId);
|
|
258
248
|
const identityConnector = this.getConnectorByUri(idParts.id);
|
|
259
|
-
await identityConnector.removeVerificationMethod(controller, verificationMethodId);
|
|
249
|
+
await identityConnector.removeVerificationMethod(controller, verificationMethodId, options);
|
|
260
250
|
}
|
|
261
251
|
catch (error) {
|
|
262
252
|
throw new GeneralError(IdentityService.CLASS_NAME, "verificationMethodRemoveFailed", { verificationMethodId }, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityService.js","sourceRoot":"","sources":["../../src/identityService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@twin.org/api-models\";\nimport type { IContextIds } from \"@twin.org/context\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport { BaseError, ComponentFactory, GeneralError, Guards, Is, Urn } from \"@twin.org/core\";\nimport type { IJsonLdContextDefinitionRoot, IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport {\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\tIdentityMetricIds,\n\tIdentityMetrics,\n\tIdentityResolverConnectorFactory,\n\ttype IIdentityComponent,\n\ttype IIdentityConnector,\n\ttype IIdentityResolverConnector\n} from \"@twin.org/identity-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDidVerificationMethodType,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IProof,\n\ttype IDidService,\n\ttype IDidVerifiableCredential,\n\ttype IDidVerifiablePresentation\n} from \"@twin.org/standards-w3c-did\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport { Jwt } from \"@twin.org/web\";\nimport type { IIdentityServiceConstructorOptions } from \"./models/IIdentityServiceConstructorOptions.js\";\n\n/**\n * Class which implements the identity contract.\n */\nexport class IdentityService implements IIdentityComponent, IHealthProviderComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<IdentityService>();\n\n\t/**\n\t * The default namespace for the connector to use.\n\t * @internal\n\t */\n\tprivate readonly _defaultNamespace: string;\n\n\t/**\n\t * The telemetry component.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * Cached result of the most recent application-level health check.\n\t * @internal\n\t */\n\tprivate _lastAppHealthResult: IHealth | undefined;\n\n\t/**\n\t * Timestamp of the last health cycle, used to enforce the health interval.\n\t * @internal\n\t */\n\tprivate _lastHealthTime: number;\n\n\t/**\n\t * Minimum interval in ms between full application-level health checks.\n\t * @internal\n\t */\n\tprivate readonly _healthInterval: number;\n\n\t/**\n\t * Create a new instance of IdentityService.\n\t * @param options The options for the service.\n\t * @throws GeneralError if no connectors are registered.\n\t */\n\tconstructor(options?: IIdentityServiceConstructorOptions) {\n\t\tconst names = IdentityConnectorFactory.names();\n\t\tif (names.length === 0) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"noConnectors\");\n\t\t}\n\n\t\tthis._defaultNamespace = options?.config?.defaultNamespace ?? names[0];\n\t\tthis._lastHealthTime = 0;\n\t\tthis._healthInterval = options?.config?.healthIntervalMs ?? 300_000;\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn IdentityService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all identity metrics with the telemetry component.\n\t * @returns A promise that resolves when all metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, IdentityMetrics);\n\t}\n\n\t/**\n\t * Creates a temporary DID document for the health check using the default namespace connector.\n\t * Skipped when called within the configured health interval.\n\t * @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.\n\t * @param contextIds The context IDs accumulated by prior init steps.\n\t */\n\tpublic async healthInit(lastTimestamp: number, contextIds: IContextIds): Promise<void> {\n\t\tif (this._lastHealthTime > 0 && lastTimestamp - this._lastHealthTime < this._healthInterval) {\n\t\t\treturn;\n\t\t}\n\t\tconst controller = contextIds[ContextIdKeys.Node];\n\t\tif (!Is.stringValue(controller)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst connector = this.getConnectorByNamespace();\n\t\t\tconst doc = await connector.createDocument(controller);\n\t\t\tawait connector.addVerificationMethod(\n\t\t\t\tcontroller,\n\t\t\t\tdoc.id,\n\t\t\t\tDidVerificationMethodType.AssertionMethod,\n\t\t\t\t\"health-assertion\"\n\t\t\t);\n\t\t\tcontextIds[ContextIdKeys.Organization] = doc.id;\n\t\t} catch (error) {\n\t\t\tthis._lastAppHealthResult = {\n\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\tmessage: \"createDocumentFailed\",\n\t\t\t\terror: BaseError.fromError(error)\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Returns the application health status of the identity service by resolving the DID created\n\t * in healthInit. On cycles where healthInit was skipped, returns the cached result.\n\t * @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.\n\t * @returns The health status of the service.\n\t */\n\tpublic async health(lastTimestamp: number): Promise<IHealth[]> {\n\t\tconst contextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\tconst orgDid = contextIds[ContextIdKeys.Organization];\n\n\t\tif (Is.stringValue(orgDid)) {\n\t\t\ttry {\n\t\t\t\tconst resolverConnector =\n\t\t\t\t\tIdentityResolverConnectorFactory.getIfExists<IIdentityResolverConnector>(\n\t\t\t\t\t\tthis._defaultNamespace\n\t\t\t\t\t);\n\t\t\t\tif (!Is.undefined(resolverConnector)) {\n\t\t\t\t\tconst resolved = await resolverConnector.resolveDocument(orgDid);\n\t\t\t\t\tthis._lastAppHealthResult = {\n\t\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\t\tstatus: Is.object(resolved) ? HealthStatus.Ok : HealthStatus.Error,\n\t\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\t\tmessage: Is.object(resolved) ? undefined : \"resolveDocumentFailed\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tdid: orgDid\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tthis._lastAppHealthResult = {\n\t\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tdid: orgDid\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._lastAppHealthResult = {\n\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"resolveDocumentFailed\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdid: orgDid\n\t\t\t\t\t},\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._lastHealthTime = lastTimestamp > 0 ? lastTimestamp : Date.now();\n\n\t\tconst results: IHealth[] = [];\n\t\tif (!Is.undefined(this._lastAppHealthResult)) {\n\t\t\tresults.push(this._lastAppHealthResult);\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Removes the DID document created in healthInit using the default namespace connector.\n\t * @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.\n\t */\n\tpublic async healthTeardown(lastTimestamp: number): Promise<void> {\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst nodeId = contextIds?.[ContextIdKeys.Node];\n\t\tconst orgId = contextIds?.[ContextIdKeys.Organization];\n\t\tif (!Is.stringValue(orgId) || !Is.stringValue(nodeId)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst connector = this.getConnectorByNamespace();\n\t\t\tawait connector.removeDocument(nodeId, orgId);\n\t\t} catch {\n\t\t\t// Best-effort cleanup; the DID will remain on-chain if removal fails.\n\t\t}\n\t}\n\n\t/**\n\t * Create a new identity.\n\t * @param namespace The namespace of the connector to use for the identity, defaults to service configured namespace.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created identity document.\n\t */\n\tpublic async identityCreate(namespace?: string, controller?: string): Promise<IDidDocument> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByNamespace(namespace);\n\t\t\tconst result = await identityConnector.createDocument(controller);\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.DidsCreated, {\n\t\t\t\tnamespace: namespace ?? this._defaultNamespace\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"identityCreateFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an identity.\n\t * @param identity The id of the document to remove.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the identity has been removed.\n\t */\n\tpublic async identityRemove(identity: string, controller?: string): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(identity), identity);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\t\t\tconst result = await identityConnector.removeDocument(controller, identity);\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.DidsRemoved);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"identityRemoveFailed\",\n\t\t\t\t{ identity },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a verification method to the document in JSON Web key Format.\n\t * @param identity The id of the document to add the verification method to.\n\t * @param verificationMethodType The type of the verification method to add.\n\t * @param verificationMethodId The id of the verification method, if undefined uses the kid of the generated JWK.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The verification method.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple keys.\n\t */\n\tpublic async verificationMethodCreate(\n\t\tidentity: string,\n\t\tverificationMethodType: DidVerificationMethodType,\n\t\tverificationMethodId?: string,\n\t\tcontroller?: string\n\t): Promise<IDidDocumentVerificationMethod> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(identity), identity);\n\n\t\tGuards.arrayOneOf(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodType),\n\t\t\tverificationMethodType,\n\t\t\tObject.values(DidVerificationMethodType)\n\t\t);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\n\t\t\tconst verificationMethod = await identityConnector.addVerificationMethod(\n\t\t\t\tcontroller,\n\t\t\t\tidentity,\n\t\t\t\tverificationMethodType,\n\t\t\t\tverificationMethodId\n\t\t\t);\n\n\t\t\treturn verificationMethod;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verificationMethodCreateFailed\",\n\t\t\t\t{ identity },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a verification method from the document.\n\t * @param verificationMethodId The id of the verification method.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the verification method has been removed.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple revocable keys.\n\t */\n\tpublic async verificationMethodRemove(\n\t\tverificationMethodId: string,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(verificationMethodId), verificationMethodId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeVerificationMethod(controller, verificationMethodId);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verificationMethodRemoveFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a service to the document.\n\t * @param identity The id of the document to add the service to.\n\t * @param serviceId The id of the service.\n\t * @param serviceType The type of the service.\n\t * @param serviceEndpoint The endpoint for the service.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The service.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async serviceCreate(\n\t\tidentity: string,\n\t\tserviceId: string,\n\t\tserviceType: string | string[],\n\t\tserviceEndpoint: string | string[],\n\t\tcontroller?: string\n\t): Promise<IDidService> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(identity), identity);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceId), serviceId);\n\t\tif (Is.array(serviceType)) {\n\t\t\tGuards.arrayValue<string>(IdentityService.CLASS_NAME, nameof(serviceType), serviceType);\n\t\t} else {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceType), serviceType);\n\t\t}\n\t\tif (Is.array(serviceEndpoint)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceEndpoint), serviceEndpoint);\n\t\t}\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\n\t\t\tconst service = await identityConnector.addService(\n\t\t\t\tcontroller,\n\t\t\t\tidentity,\n\t\t\t\tserviceId,\n\t\t\t\tserviceType,\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"serviceCreateFailed\",\n\t\t\t\t{ identity, serviceId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a service from the document.\n\t * @param serviceId The id of the service.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the service has been removed.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async serviceRemove(serviceId: string, controller?: string): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(serviceId), serviceId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(serviceId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeService(controller, serviceId);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"serviceRemoveFailed\",\n\t\t\t\t{ serviceId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an alias to the alsoKnownAs property on the document.\n\t * If the alias is already present the operation is a no-op.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to add. Must be a Url or Urn (typically another DID).\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the alias has been added.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async alsoKnownAsAdd(\n\t\tdocumentId: string,\n\t\talias: string,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(alias), alias);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(documentId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.addAlsoKnownAs(controller, documentId, alias);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"alsoKnownAsAddFailed\",\n\t\t\t\t{ identity: documentId, alias },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an alias from the alsoKnownAs property on the document.\n\t * If the alias is not present the operation is a no-op.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to remove. Must be a Url or Urn.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the alias has been removed.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async alsoKnownAsRemove(\n\t\tdocumentId: string,\n\t\talias: string,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(alias), alias);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(documentId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeAlsoKnownAs(controller, documentId, alias);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"alsoKnownAsRemoveFailed\",\n\t\t\t\t{ identity: documentId, alias },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable credential for a verification method.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param id The id of the credential.\n\t * @param subject The credential subject to store in the verifiable credential.\n\t * @param options Additional options for creating the verifiable credential.\n\t * @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.\n\t * @param options.expirationDate The date the verifiable credential is valid until.\n\t * @param options.jwtHeaderFields Additional fields to include in the JWT header when creating the verifiable credential in jwt format.\n\t * @param options.jwtPayloadFields Additional fields to include in the JWT payload when creating the verifiable credential in jwt format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created verifiable credential and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async verifiableCredentialCreate(\n\t\tverificationMethodId: string,\n\t\tid: string | undefined,\n\t\tsubject: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\trevocationIndex?: number;\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t},\n\t\tcontroller?: string\n\t): Promise<{\n\t\tverifiableCredential: IDidVerifiableCredential;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(verificationMethodId), verificationMethodId);\n\t\tGuards.object(IdentityService.CLASS_NAME, nameof(subject), subject);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst service = await identityConnector.createVerifiableCredential(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tid,\n\t\t\t\tsubject,\n\t\t\t\toptions\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsCreated, {\n\t\t\t\thasRevocation: Is.number(options?.revocationIndex),\n\t\t\t\thasExpiration: Is.date(options?.expirationDate)\n\t\t\t});\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a verifiable credential is valid.\n\t * @param credential The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async verifiableCredentialVerify(credential: string | IDidVerifiableCredential): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredential;\n\t}> {\n\t\tif (Is.object(credential)) {\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(credential),\n\t\t\t\tcredential\n\t\t\t);\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(credential.issuer), credential.issuer);\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(credential.proof),\n\t\t\t\tcredential.proof\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst identityConnector = this.getConnectorByUri(credential.issuer);\n\n\t\t\t\tconst service = await identityConnector.checkVerifiableCredential(credential);\n\n\t\t\t\tif (service.revoked) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tIdentityMetricIds.VcsVerificationFailed,\n\t\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tIdentityMetricIds.VcsVerified\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn service;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\t\"verifiableCredentialVerifyFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(credential), credential);\n\n\t\tconst jwtDecoded = await Jwt.decode(credential);\n\n\t\tconst jwtHeader = jwtDecoded.header;\n\t\tconst jwtPayload = jwtDecoded.payload;\n\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\tif (\n\t\t\tIs.undefined(jwtHeader) ||\n\t\t\tIs.undefined(jwtPayload) ||\n\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\tIs.undefined(jwtSignature)\n\t\t) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"jwtDecodeFailed\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(jwtPayload.iss);\n\n\t\t\tconst service = await identityConnector.checkVerifiableCredential(credential);\n\n\t\t\tif (service.revoked) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tIdentityMetricIds.VcsVerificationFailed,\n\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsVerified);\n\t\t\t}\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialVerifyFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Revoke verifiable credential.\n\t * @param issuerIdentity The id of the document to update the revocation list for.\n\t * @param credentialIndex The revocation bitmap index to revoke.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the credential has been revoked.\n\t */\n\tpublic async verifiableCredentialRevoke(\n\t\tissuerIdentity: string,\n\t\tcredentialIndex: number,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(issuerIdentity), issuerIdentity);\n\t\tGuards.number(IdentityService.CLASS_NAME, nameof(credentialIndex), credentialIndex);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(issuerIdentity);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.revokeVerifiableCredentials(\n\t\t\t\tcontroller,\n\t\t\t\tissuerIdentity,\n\t\t\t\t[credentialIndex]\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsRevoked);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialRevokeFailed\",\n\t\t\t\t{ issuerIdentity, credentialIndex },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Unrevoke verifiable credential.\n\t * @param issuerIdentity The id of the document to update the revocation list for.\n\t * @param credentialIndex The revocation bitmap index to un revoke.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the credential has been unrevoked.\n\t */\n\tpublic async verifiableCredentialUnrevoke(\n\t\tissuerIdentity: string,\n\t\tcredentialIndex: number,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(issuerIdentity), issuerIdentity);\n\t\tGuards.number(IdentityService.CLASS_NAME, nameof(credentialIndex), credentialIndex);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(issuerIdentity);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.unrevokeVerifiableCredentials(\n\t\t\t\tcontroller,\n\t\t\t\tissuerIdentity,\n\t\t\t\t[credentialIndex]\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsUnrevoked);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialUnrevokeFailed\",\n\t\t\t\t{ issuerIdentity, credentialIndex },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable presentation from the supplied verifiable credentials.\n\t * @param verificationMethodId The method to associate with the presentation.\n\t * @param presentationId The id of the presentation.\n\t * @param contexts The contexts for the data stored in the verifiable credential.\n\t * @param types The types for the data stored in the verifiable credential.\n\t * @param verifiableCredentials The credentials to use for creating the presentation in jwt format.\n\t * @param options Additional options for creating the verifiable presentation.\n\t * @param options.expirationDate The date the verifiable presentation is valid until.\n\t * @param options.jwtHeaderFields Additional fields to include in the JWT header when creating the verifiable presentation in jwt format.\n\t * @param options.jwtPayloadFields\tAdditional fields to include in the JWT payload when creating the verifiable presentation in jwt format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created verifiable presentation and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async verifiablePresentationCreate(\n\t\tverificationMethodId: string,\n\t\tpresentationId: string | undefined,\n\t\tcontexts: IJsonLdContextDefinitionRoot | undefined,\n\t\ttypes: string | string[] | undefined,\n\t\tverifiableCredentials: (string | IDidVerifiableCredential)[],\n\t\toptions?: {\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t},\n\t\tcontroller?: string\n\t): Promise<{\n\t\tverifiablePresentation: IDidVerifiablePresentation;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.createVerifiablePresentation(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tpresentationId,\n\t\t\t\tcontexts,\n\t\t\t\ttypes,\n\t\t\t\tverifiableCredentials,\n\t\t\t\toptions\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VpsCreated, {\n\t\t\t\tcredentialCount: verifiableCredentials.length\n\t\t\t});\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiablePresentationCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a verifiable presentation is valid.\n\t * @param presentation The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async verifiablePresentationVerify(\n\t\tpresentation: string | IDidVerifiablePresentation\n\t): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentation;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tlet holder;\n\t\tif (Is.stringValue(presentation)) {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(presentation), presentation);\n\n\t\t\tconst jwtDecoded = await Jwt.decode(presentation);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"jwtDecodeFailed\");\n\t\t\t}\n\n\t\t\tholder = jwtPayload.iss;\n\t\t} else {\n\t\t\tholder = presentation.holder;\n\t\t}\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(holder), holder);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(holder);\n\n\t\t\tconst service = await identityConnector.checkVerifiablePresentation(presentation);\n\n\t\t\tif (service.revoked) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tIdentityMetricIds.VpsVerificationFailed,\n\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VpsVerified);\n\t\t\t}\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiablePresentationVerifyFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a proof for a document with the specified verification method.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param proofType The type of proof to create.\n\t * @param unsecureDocument The unsecure document to create the proof for.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The proof.\n\t */\n\tpublic async proofCreate(\n\t\tverificationMethodId: string,\n\t\tproofType: ProofTypes,\n\t\tunsecureDocument: IJsonLdNodeObject,\n\t\tcontroller?: string\n\t): Promise<IProof> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.arrayOneOf<ProofTypes>(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(proofType),\n\t\t\tproofType,\n\t\t\tObject.values(ProofTypes)\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(unsecureDocument),\n\t\t\tunsecureDocument\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"proofCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify proof for a document with the specified verification method.\n\t * @param document The document to verify.\n\t * @param proof The proof to verify.\n\t * @returns True if the proof is verified.\n\t */\n\tpublic async proofVerify(document: IJsonLdNodeObject, proof: IProof): Promise<boolean> {\n\t\tGuards.object<IJsonLdNodeObject>(IdentityService.CLASS_NAME, nameof(document), document);\n\t\tGuards.object<IProof>(IdentityService.CLASS_NAME, nameof(proof), proof);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(proof.verificationMethod),\n\t\t\tproof.verificationMethod\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(proof.verificationMethod);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.verifyProof(document, proof);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"proofVerifyFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get the connector from the namespace.\n\t * @param namespace The namespace for the identity.\n\t * @returns The connector.\n\t * @throws GeneralError if the connector is not found.\n\t * @internal\n\t */\n\tprivate getConnectorByNamespace(namespace?: string): IIdentityConnector {\n\t\tconst namespaceMethod = namespace ?? this._defaultNamespace;\n\n\t\tconst connector = IdentityConnectorFactory.getIfExists<IIdentityConnector>(namespaceMethod);\n\n\t\tif (Is.empty(connector)) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"connectorNotFound\", {\n\t\t\t\tnamespace: namespaceMethod\n\t\t\t});\n\t\t}\n\n\t\treturn connector;\n\t}\n\n\t/**\n\t * Get the connector from the uri.\n\t * @param id The id of the identity in urn format.\n\t * @returns The connector.\n\t * @throws GeneralError if the namespace does not match or the connector is not found.\n\t * @internal\n\t */\n\tprivate getConnectorByUri(id: string): IIdentityConnector {\n\t\tconst idUri = Urn.fromValidString(id);\n\n\t\tif (idUri.namespaceIdentifier() !== \"did\") {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: \"did\",\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn this.getConnectorByNamespace(idUri.namespaceMethod());\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"identityService.js","sourceRoot":"","sources":["../../src/identityService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype HealthApplicationCallback,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@twin.org/api-models\";\nimport type { IContextIds } from \"@twin.org/context\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport { BaseError, ComponentFactory, GeneralError, Guards, Is, Urn } from \"@twin.org/core\";\nimport type { IJsonLdContextDefinitionRoot, IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport { AccountHelper } from \"@twin.org/dlt-account\";\nimport {\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\tIdentityMetricIds,\n\tIdentityMetrics,\n\tIdentityResolverConnectorFactory,\n\ttype IIdentityComponent,\n\ttype IIdentityConnector,\n\ttype IIdentityResolverConnector\n} from \"@twin.org/identity-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDidVerificationMethodType,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IProof,\n\ttype IDidService,\n\ttype IDidVerifiableCredential,\n\ttype IDidVerifiablePresentation\n} from \"@twin.org/standards-w3c-did\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport { type IVaultConnector, VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport { Jwt } from \"@twin.org/web\";\nimport type { IIdentityServiceConstructorOptions } from \"./models/IIdentityServiceConstructorOptions.js\";\n\n/**\n * Class which implements the identity contract.\n */\nexport class IdentityService implements IIdentityComponent, IHealthProviderComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<IdentityService>();\n\n\t/**\n\t * The default namespace for the connector to use.\n\t * @internal\n\t */\n\tprivate readonly _defaultNamespace: string;\n\n\t/**\n\t * The vault connector type used for mnemonic migration during health check init.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * The telemetry component.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * Create a new instance of IdentityService.\n\t * @param options The options for the service.\n\t * @throws GeneralError if no connectors are registered.\n\t */\n\tconstructor(options?: IIdentityServiceConstructorOptions) {\n\t\tconst names = IdentityConnectorFactory.names();\n\t\tif (names.length === 0) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"noConnectors\");\n\t\t}\n\n\t\tthis._defaultNamespace = options?.config?.defaultNamespace ?? names[0];\n\n\t\tthis._vaultConnector = VaultConnectorFactory.get(options?.vaultConnectorType ?? \"vault\");\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn IdentityService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all identity metrics with the telemetry component.\n\t * @returns A promise that resolves when all metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, IdentityMetrics);\n\t}\n\n\t/**\n\t * Creates a temporary DID document for the application health check.\n\t * @param contextIds The context IDs accumulated by prior init steps.\n\t */\n\tpublic async healthApplicationInit(contextIds: IContextIds): Promise<void> {\n\t\t// The wallet service has already setup a temporary controller DID mnemonic for the health check\n\t\t// so we can use that to create a new document and add a verification method to it.\n\t\tconst controller = contextIds[ContextIdKeys.Organization];\n\t\tif (!Is.stringValue(controller)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst connector = this.getConnectorByNamespace();\n\t\t\tconst doc = await connector.createDocument(controller);\n\t\t\tawait connector.addVerificationMethod(\n\t\t\t\tcontroller,\n\t\t\t\tdoc.id,\n\t\t\t\tDidVerificationMethodType.AssertionMethod,\n\t\t\t\t\"health-assertion\"\n\t\t\t);\n\n\t\t\t// The original seed/mnemonic/keys were created with the temp orgId\n\t\t\t// so we need to migrate them to the new document id so that the health check can resolve the DID.\n\t\t\tawait AccountHelper.renameAccountKeys(undefined, this._vaultConnector, controller, doc.id);\n\n\t\t\t// Replace the updated contextIds with the new document id for the health check.\n\t\t\tcontextIds[ContextIdKeys.Organization] = doc.id;\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Returns the application health status of the identity service by resolving the DID created\n\t * in healthApplicationInit.\n\t * @param callback Callback for deferred results.\n\t * @returns The health status of the service.\n\t */\n\tpublic async healthApplication(\n\t\tcallback: HealthApplicationCallback\n\t): Promise<IHealth[] | undefined> {\n\t\tconst contextIds = (await ContextIdStore.getContextIds()) ?? {};\n\t\tconst orgDid = contextIds[ContextIdKeys.Organization];\n\n\t\tif (!Is.stringValue(orgDid)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"createDocumentFailed\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdid: orgDid\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\n\t\ttry {\n\t\t\tconst resolverConnector =\n\t\t\t\tIdentityResolverConnectorFactory.getIfExists<IIdentityResolverConnector>(\n\t\t\t\t\tthis._defaultNamespace\n\t\t\t\t);\n\t\t\tif (!Is.undefined(resolverConnector)) {\n\t\t\t\tconst resolved = await resolverConnector.resolveDocument(orgDid);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\t\tstatus: Is.object(resolved) ? HealthStatus.Ok : HealthStatus.Error,\n\t\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\t\tmessage: Is.object(resolved) ? undefined : \"resolveDocumentFailed\",\n\t\t\t\t\t\tdata: { did: orgDid }\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tdata: { did: orgDid }\n\t\t\t\t}\n\t\t\t];\n\t\t} catch (error) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: IdentityService.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Application,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"resolveDocumentFailed\",\n\t\t\t\t\tdata: { did: orgDid },\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t}\n\n\t/**\n\t * Removes the DID document created in healthApplicationInit.\n\t */\n\tpublic async healthApplicationTeardown(): Promise<void> {\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst orgId = contextIds?.[ContextIdKeys.Organization];\n\t\tif (!Is.stringValue(orgId)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst connector = this.getConnectorByNamespace();\n\t\t\tawait connector.removeVerificationMethod(orgId, `${orgId}#health-assertion`, {\n\t\t\t\tremoveKeys: true\n\t\t\t});\n\t\t\tawait connector.removeDocument(orgId, orgId);\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Create a new identity.\n\t * @param namespace The namespace of the connector to use for the identity, defaults to service configured namespace.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created identity document.\n\t */\n\tpublic async identityCreate(namespace?: string, controller?: string): Promise<IDidDocument> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByNamespace(namespace);\n\t\t\tconst result = await identityConnector.createDocument(controller);\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.DidsCreated, {\n\t\t\t\tnamespace: namespace ?? this._defaultNamespace\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"identityCreateFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an identity.\n\t * @param identity The id of the document to remove.\n\t * @param options Optional settings.\n\t * @param options.removeKeys Also remove any associated private keys from the vault.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the identity has been removed.\n\t */\n\tpublic async identityRemove(\n\t\tidentity: string,\n\t\toptions?: { removeKeys?: boolean },\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(identity), identity);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\t\t\tconst result = await identityConnector.removeDocument(controller, identity, options);\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.DidsRemoved);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"identityRemoveFailed\",\n\t\t\t\t{ identity },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a verification method to the document in JSON Web key Format.\n\t * @param identity The id of the document to add the verification method to.\n\t * @param verificationMethodType The type of the verification method to add.\n\t * @param verificationMethodId The id of the verification method, if undefined uses the kid of the generated JWK.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The verification method.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple keys.\n\t */\n\tpublic async verificationMethodCreate(\n\t\tidentity: string,\n\t\tverificationMethodType: DidVerificationMethodType,\n\t\tverificationMethodId?: string,\n\t\tcontroller?: string\n\t): Promise<IDidDocumentVerificationMethod> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(identity), identity);\n\n\t\tGuards.arrayOneOf(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodType),\n\t\t\tverificationMethodType,\n\t\t\tObject.values(DidVerificationMethodType)\n\t\t);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\n\t\t\tconst verificationMethod = await identityConnector.addVerificationMethod(\n\t\t\t\tcontroller,\n\t\t\t\tidentity,\n\t\t\t\tverificationMethodType,\n\t\t\t\tverificationMethodId\n\t\t\t);\n\n\t\t\treturn verificationMethod;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verificationMethodCreateFailed\",\n\t\t\t\t{ identity },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a verification method from the document.\n\t * @param verificationMethodId The id of the verification method.\n\t * @param options Optional settings.\n\t * @param options.removeKeys Also remove any associated private key from the vault.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the verification method has been removed.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple revocable keys.\n\t */\n\tpublic async verificationMethodRemove(\n\t\tverificationMethodId: string,\n\t\toptions?: { removeKeys?: boolean },\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(verificationMethodId), verificationMethodId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeVerificationMethod(controller, verificationMethodId, options);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verificationMethodRemoveFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a service to the document.\n\t * @param identity The id of the document to add the service to.\n\t * @param serviceId The id of the service.\n\t * @param serviceType The type of the service.\n\t * @param serviceEndpoint The endpoint for the service.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The service.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async serviceCreate(\n\t\tidentity: string,\n\t\tserviceId: string,\n\t\tserviceType: string | string[],\n\t\tserviceEndpoint: string | string[],\n\t\tcontroller?: string\n\t): Promise<IDidService> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(identity), identity);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceId), serviceId);\n\t\tif (Is.array(serviceType)) {\n\t\t\tGuards.arrayValue<string>(IdentityService.CLASS_NAME, nameof(serviceType), serviceType);\n\t\t} else {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceType), serviceType);\n\t\t}\n\t\tif (Is.array(serviceEndpoint)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(serviceEndpoint), serviceEndpoint);\n\t\t}\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(identity);\n\n\t\t\tconst service = await identityConnector.addService(\n\t\t\t\tcontroller,\n\t\t\t\tidentity,\n\t\t\t\tserviceId,\n\t\t\t\tserviceType,\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"serviceCreateFailed\",\n\t\t\t\t{ identity, serviceId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a service from the document.\n\t * @param serviceId The id of the service.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the service has been removed.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async serviceRemove(serviceId: string, controller?: string): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(serviceId), serviceId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(serviceId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeService(controller, serviceId);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"serviceRemoveFailed\",\n\t\t\t\t{ serviceId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an alias to the alsoKnownAs property on the document.\n\t * If the alias is already present the operation is a no-op.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to add. Must be a Url or Urn (typically another DID).\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the alias has been added.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async alsoKnownAsAdd(\n\t\tdocumentId: string,\n\t\talias: string,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(alias), alias);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(documentId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.addAlsoKnownAs(controller, documentId, alias);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"alsoKnownAsAddFailed\",\n\t\t\t\t{ identity: documentId, alias },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an alias from the alsoKnownAs property on the document.\n\t * If the alias is not present the operation is a no-op.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to remove. Must be a Url or Urn.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the alias has been removed.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async alsoKnownAsRemove(\n\t\tdocumentId: string,\n\t\talias: string,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(alias), alias);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(documentId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tawait identityConnector.removeAlsoKnownAs(controller, documentId, alias);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"alsoKnownAsRemoveFailed\",\n\t\t\t\t{ identity: documentId, alias },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable credential for a verification method.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param id The id of the credential.\n\t * @param subject The credential subject to store in the verifiable credential.\n\t * @param options Additional options for creating the verifiable credential.\n\t * @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.\n\t * @param options.expirationDate The date the verifiable credential is valid until.\n\t * @param options.jwtHeaderFields Additional fields to include in the JWT header when creating the verifiable credential in jwt format.\n\t * @param options.jwtPayloadFields Additional fields to include in the JWT payload when creating the verifiable credential in jwt format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created verifiable credential and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async verifiableCredentialCreate(\n\t\tverificationMethodId: string,\n\t\tid: string | undefined,\n\t\tsubject: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\trevocationIndex?: number;\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t},\n\t\tcontroller?: string\n\t): Promise<{\n\t\tverifiableCredential: IDidVerifiableCredential;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tUrn.guard(IdentityService.CLASS_NAME, nameof(verificationMethodId), verificationMethodId);\n\t\tGuards.object(IdentityService.CLASS_NAME, nameof(subject), subject);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst service = await identityConnector.createVerifiableCredential(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tid,\n\t\t\t\tsubject,\n\t\t\t\toptions\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsCreated, {\n\t\t\t\thasRevocation: Is.number(options?.revocationIndex),\n\t\t\t\thasExpiration: Is.date(options?.expirationDate)\n\t\t\t});\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a verifiable credential is valid.\n\t * @param credential The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async verifiableCredentialVerify(credential: string | IDidVerifiableCredential): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredential;\n\t}> {\n\t\tif (Is.object(credential)) {\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(credential),\n\t\t\t\tcredential\n\t\t\t);\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(credential.issuer), credential.issuer);\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\tnameof(credential.proof),\n\t\t\t\tcredential.proof\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst identityConnector = this.getConnectorByUri(credential.issuer);\n\n\t\t\t\tconst service = await identityConnector.checkVerifiableCredential(credential);\n\n\t\t\t\tif (service.revoked) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tIdentityMetricIds.VcsVerificationFailed,\n\t\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tIdentityMetricIds.VcsVerified\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn service;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\t\"verifiableCredentialVerifyFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(credential), credential);\n\n\t\tconst jwtDecoded = await Jwt.decode(credential);\n\n\t\tconst jwtHeader = jwtDecoded.header;\n\t\tconst jwtPayload = jwtDecoded.payload;\n\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\tif (\n\t\t\tIs.undefined(jwtHeader) ||\n\t\t\tIs.undefined(jwtPayload) ||\n\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\tIs.undefined(jwtSignature)\n\t\t) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"jwtDecodeFailed\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(jwtPayload.iss);\n\n\t\t\tconst service = await identityConnector.checkVerifiableCredential(credential);\n\n\t\t\tif (service.revoked) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tIdentityMetricIds.VcsVerificationFailed,\n\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsVerified);\n\t\t\t}\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialVerifyFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Revoke verifiable credential.\n\t * @param issuerIdentity The id of the document to update the revocation list for.\n\t * @param credentialIndex The revocation bitmap index to revoke.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the credential has been revoked.\n\t */\n\tpublic async verifiableCredentialRevoke(\n\t\tissuerIdentity: string,\n\t\tcredentialIndex: number,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(issuerIdentity), issuerIdentity);\n\t\tGuards.number(IdentityService.CLASS_NAME, nameof(credentialIndex), credentialIndex);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(issuerIdentity);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.revokeVerifiableCredentials(\n\t\t\t\tcontroller,\n\t\t\t\tissuerIdentity,\n\t\t\t\t[credentialIndex]\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsRevoked);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialRevokeFailed\",\n\t\t\t\t{ issuerIdentity, credentialIndex },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Unrevoke verifiable credential.\n\t * @param issuerIdentity The id of the document to update the revocation list for.\n\t * @param credentialIndex The revocation bitmap index to un revoke.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns A promise that resolves when the credential has been unrevoked.\n\t */\n\tpublic async verifiableCredentialUnrevoke(\n\t\tissuerIdentity: string,\n\t\tcredentialIndex: number,\n\t\tcontroller?: string\n\t): Promise<void> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(issuerIdentity), issuerIdentity);\n\t\tGuards.number(IdentityService.CLASS_NAME, nameof(credentialIndex), credentialIndex);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(issuerIdentity);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.unrevokeVerifiableCredentials(\n\t\t\t\tcontroller,\n\t\t\t\tissuerIdentity,\n\t\t\t\t[credentialIndex]\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VcsUnrevoked);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiableCredentialUnrevokeFailed\",\n\t\t\t\t{ issuerIdentity, credentialIndex },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable presentation from the supplied verifiable credentials.\n\t * @param verificationMethodId The method to associate with the presentation.\n\t * @param presentationId The id of the presentation.\n\t * @param contexts The contexts for the data stored in the verifiable credential.\n\t * @param types The types for the data stored in the verifiable credential.\n\t * @param verifiableCredentials The credentials to use for creating the presentation in jwt format.\n\t * @param options Additional options for creating the verifiable presentation.\n\t * @param options.expirationDate The date the verifiable presentation is valid until.\n\t * @param options.jwtHeaderFields Additional fields to include in the JWT header when creating the verifiable presentation in jwt format.\n\t * @param options.jwtPayloadFields\tAdditional fields to include in the JWT payload when creating the verifiable presentation in jwt format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created verifiable presentation and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async verifiablePresentationCreate(\n\t\tverificationMethodId: string,\n\t\tpresentationId: string | undefined,\n\t\tcontexts: IJsonLdContextDefinitionRoot | undefined,\n\t\ttypes: string | string[] | undefined,\n\t\tverifiableCredentials: (string | IDidVerifiableCredential)[],\n\t\toptions?: {\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t},\n\t\tcontroller?: string\n\t): Promise<{\n\t\tverifiablePresentation: IDidVerifiablePresentation;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.createVerifiablePresentation(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tpresentationId,\n\t\t\t\tcontexts,\n\t\t\t\ttypes,\n\t\t\t\tverifiableCredentials,\n\t\t\t\toptions\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VpsCreated, {\n\t\t\t\tcredentialCount: verifiableCredentials.length\n\t\t\t});\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiablePresentationCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a verifiable presentation is valid.\n\t * @param presentation The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async verifiablePresentationVerify(\n\t\tpresentation: string | IDidVerifiablePresentation\n\t): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentation;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tlet holder;\n\t\tif (Is.stringValue(presentation)) {\n\t\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(presentation), presentation);\n\n\t\t\tconst jwtDecoded = await Jwt.decode(presentation);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"jwtDecodeFailed\");\n\t\t\t}\n\n\t\t\tholder = jwtPayload.iss;\n\t\t} else {\n\t\t\tholder = presentation.holder;\n\t\t}\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(holder), holder);\n\n\t\ttry {\n\t\t\tconst identityConnector = this.getConnectorByUri(holder);\n\n\t\t\tconst service = await identityConnector.checkVerifiablePresentation(presentation);\n\n\t\t\tif (service.revoked) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tIdentityMetricIds.VpsVerificationFailed,\n\t\t\t\t\t{ failureReason: \"revoked\" }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait MetricHelper.metricIncrement(this._telemetryComponent, IdentityMetricIds.VpsVerified);\n\t\t\t}\n\n\t\t\treturn service;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"verifiablePresentationVerifyFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a proof for a document with the specified verification method.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param proofType The type of proof to create.\n\t * @param unsecureDocument The unsecure document to create the proof for.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The proof.\n\t */\n\tpublic async proofCreate(\n\t\tverificationMethodId: string,\n\t\tproofType: ProofTypes,\n\t\tunsecureDocument: IJsonLdNodeObject,\n\t\tcontroller?: string\n\t): Promise<IProof> {\n\t\tGuards.stringValue(IdentityService.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.arrayOneOf<ProofTypes>(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(proofType),\n\t\t\tproofType,\n\t\t\tObject.values(ProofTypes)\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(unsecureDocument),\n\t\t\tunsecureDocument\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIdentityService.CLASS_NAME,\n\t\t\t\t\"proofCreateFailed\",\n\t\t\t\t{ verificationMethodId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify proof for a document with the specified verification method.\n\t * @param document The document to verify.\n\t * @param proof The proof to verify.\n\t * @returns True if the proof is verified.\n\t */\n\tpublic async proofVerify(document: IJsonLdNodeObject, proof: IProof): Promise<boolean> {\n\t\tGuards.object<IJsonLdNodeObject>(IdentityService.CLASS_NAME, nameof(document), document);\n\t\tGuards.object<IProof>(IdentityService.CLASS_NAME, nameof(proof), proof);\n\t\tGuards.stringValue(\n\t\t\tIdentityService.CLASS_NAME,\n\t\t\tnameof(proof.verificationMethod),\n\t\t\tproof.verificationMethod\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(proof.verificationMethod);\n\n\t\t\tconst identityConnector = this.getConnectorByUri(idParts.id);\n\n\t\t\tconst result = await identityConnector.verifyProof(document, proof);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"proofVerifyFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get the connector from the namespace.\n\t * @param namespace The namespace for the identity.\n\t * @returns The connector.\n\t * @throws GeneralError if the connector is not found.\n\t * @internal\n\t */\n\tprivate getConnectorByNamespace(namespace?: string): IIdentityConnector {\n\t\tconst namespaceMethod = namespace ?? this._defaultNamespace;\n\n\t\tconst connector = IdentityConnectorFactory.getIfExists<IIdentityConnector>(namespaceMethod);\n\n\t\tif (Is.empty(connector)) {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"connectorNotFound\", {\n\t\t\t\tnamespace: namespaceMethod\n\t\t\t});\n\t\t}\n\n\t\treturn connector;\n\t}\n\n\t/**\n\t * Get the connector from the uri.\n\t * @param id The id of the identity in urn format.\n\t * @returns The connector.\n\t * @throws GeneralError if the namespace does not match or the connector is not found.\n\t * @internal\n\t */\n\tprivate getConnectorByUri(id: string): IIdentityConnector {\n\t\tconst idUri = Urn.fromValidString(id);\n\n\t\tif (idUri.namespaceIdentifier() !== \"did\") {\n\t\t\tthrow new GeneralError(IdentityService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: \"did\",\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn this.getConnectorByNamespace(idUri.namespaceMethod());\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IIdentityServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IIdentityServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the Identity Service.\n */\nexport interface IIdentityServiceConfig {\n\t/**\n\t * The default connector namespace to use for identity operations. If not provided, the first registered connector is used.\n\t */\n\tdefaultNamespace?: string;\n
|
|
1
|
+
{"version":3,"file":"IIdentityServiceConfig.js","sourceRoot":"","sources":["../../../src/models/IIdentityServiceConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the Identity Service.\n */\nexport interface IIdentityServiceConfig {\n\t/**\n\t * The default connector namespace to use for identity operations. If not provided, the first registered connector is used.\n\t */\n\tdefaultNamespace?: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IIdentityServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IIdentityServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IIdentityServiceConfig } from \"./IIdentityServiceConfig.js\";\n\n/**\n * Options for the identity service constructor.\n */\nexport interface IIdentityServiceConstructorOptions {\n\t/**\n\t * The configuration for the identity service.\n\t */\n\tconfig?: IIdentityServiceConfig;\n\n\t/**\n\t * The component type for the optional telemetry component used for event metrics.\n\t */\n\ttelemetryComponentType?: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IIdentityServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IIdentityServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IIdentityServiceConfig } from \"./IIdentityServiceConfig.js\";\n\n/**\n * Options for the identity service constructor.\n */\nexport interface IIdentityServiceConstructorOptions {\n\t/**\n\t * The configuration for the identity service.\n\t */\n\tconfig?: IIdentityServiceConfig;\n\n\t/**\n\t * The component type for the optional telemetry component used for event metrics.\n\t */\n\ttelemetryComponentType?: string;\n\n\t/**\n\t * The vault connector type to use for migrating the mnemonic during health check initialisation.\n\t * @default vault\n\t */\n\tvaultConnectorType?: string;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IHealth, type IHealthProviderComponent } from "@twin.org/api-models";
|
|
1
|
+
import { type HealthApplicationCallback, type IHealth, type IHealthProviderComponent } from "@twin.org/api-models";
|
|
2
2
|
import type { IContextIds } from "@twin.org/context";
|
|
3
3
|
import type { IJsonLdContextDefinitionRoot, IJsonLdNodeObject } from "@twin.org/data-json-ld";
|
|
4
4
|
import { type IIdentityComponent } from "@twin.org/identity-models";
|
|
@@ -29,24 +29,21 @@ export declare class IdentityService implements IIdentityComponent, IHealthProvi
|
|
|
29
29
|
*/
|
|
30
30
|
start(): Promise<void>;
|
|
31
31
|
/**
|
|
32
|
-
* Creates a temporary DID document for the health check
|
|
33
|
-
* Skipped when called within the configured health interval.
|
|
34
|
-
* @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.
|
|
32
|
+
* Creates a temporary DID document for the application health check.
|
|
35
33
|
* @param contextIds The context IDs accumulated by prior init steps.
|
|
36
34
|
*/
|
|
37
|
-
|
|
35
|
+
healthApplicationInit(contextIds: IContextIds): Promise<void>;
|
|
38
36
|
/**
|
|
39
37
|
* Returns the application health status of the identity service by resolving the DID created
|
|
40
|
-
* in
|
|
41
|
-
* @param
|
|
38
|
+
* in healthApplicationInit.
|
|
39
|
+
* @param callback Callback for deferred results.
|
|
42
40
|
* @returns The health status of the service.
|
|
43
41
|
*/
|
|
44
|
-
|
|
42
|
+
healthApplication(callback: HealthApplicationCallback): Promise<IHealth[] | undefined>;
|
|
45
43
|
/**
|
|
46
|
-
* Removes the DID document created in
|
|
47
|
-
* @param lastTimestamp The Unix timestamp (ms) recorded at the start of the previous cycle.
|
|
44
|
+
* Removes the DID document created in healthApplicationInit.
|
|
48
45
|
*/
|
|
49
|
-
|
|
46
|
+
healthApplicationTeardown(): Promise<void>;
|
|
50
47
|
/**
|
|
51
48
|
* Create a new identity.
|
|
52
49
|
* @param namespace The namespace of the connector to use for the identity, defaults to service configured namespace.
|
|
@@ -57,10 +54,14 @@ export declare class IdentityService implements IIdentityComponent, IHealthProvi
|
|
|
57
54
|
/**
|
|
58
55
|
* Remove an identity.
|
|
59
56
|
* @param identity The id of the document to remove.
|
|
57
|
+
* @param options Optional settings.
|
|
58
|
+
* @param options.removeKeys Also remove any associated private keys from the vault.
|
|
60
59
|
* @param controller The controller of the identity who can make changes.
|
|
61
60
|
* @returns A promise that resolves when the identity has been removed.
|
|
62
61
|
*/
|
|
63
|
-
identityRemove(identity: string,
|
|
62
|
+
identityRemove(identity: string, options?: {
|
|
63
|
+
removeKeys?: boolean;
|
|
64
|
+
}, controller?: string): Promise<void>;
|
|
64
65
|
/**
|
|
65
66
|
* Add a verification method to the document in JSON Web key Format.
|
|
66
67
|
* @param identity The id of the document to add the verification method to.
|
|
@@ -75,12 +76,16 @@ export declare class IdentityService implements IIdentityComponent, IHealthProvi
|
|
|
75
76
|
/**
|
|
76
77
|
* Remove a verification method from the document.
|
|
77
78
|
* @param verificationMethodId The id of the verification method.
|
|
79
|
+
* @param options Optional settings.
|
|
80
|
+
* @param options.removeKeys Also remove any associated private key from the vault.
|
|
78
81
|
* @param controller The controller of the identity who can make changes.
|
|
79
82
|
* @returns A promise that resolves when the verification method has been removed.
|
|
80
83
|
* @throws NotFoundError if the id can not be resolved.
|
|
81
84
|
* @throws NotSupportedError if the platform does not support multiple revocable keys.
|
|
82
85
|
*/
|
|
83
|
-
verificationMethodRemove(verificationMethodId: string,
|
|
86
|
+
verificationMethodRemove(verificationMethodId: string, options?: {
|
|
87
|
+
removeKeys?: boolean;
|
|
88
|
+
}, controller?: string): Promise<void>;
|
|
84
89
|
/**
|
|
85
90
|
* Add a service to the document.
|
|
86
91
|
* @param identity The id of the document to add the service to.
|
|
@@ -6,9 +6,4 @@ export interface IIdentityServiceConfig {
|
|
|
6
6
|
* The default connector namespace to use for identity operations. If not provided, the first registered connector is used.
|
|
7
7
|
*/
|
|
8
8
|
defaultNamespace?: string;
|
|
9
|
-
/**
|
|
10
|
-
* The minimum interval in ms between full application-level health checks (DID create, resolve, remove).
|
|
11
|
-
* @default 300000
|
|
12
|
-
*/
|
|
13
|
-
healthIntervalMs?: number;
|
|
14
9
|
}
|