@ideem/zsm-client-sdk 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,19 +1,38 @@
1
- ZSM Client SDK for Browser Apps
2
- Latest version: v2.5.0
3
- Latest release date: Aug 29, 2025
1
+ # ZSM Client SDK for Browser Apps
4
2
 
5
3
  The ZSM Client SDK for Browser Apps provides the resources needed to integrate Ideem's FIDO2 Authenticator
6
4
  and Universal MFA into a browser application.
7
5
 
8
6
  ## Resources:
7
+ - Documentation: https://docs.useideem.com/pkp
9
8
  - Support: support@useideem.com
10
9
 
11
10
  ## Known Issues
12
- - A corner-case exists in which a developer, using both the core SDK packages as well as the Passkeys+ SDK, may encounter conflicts if a ZSM credential is re-enrolled after the Passkeys+ credential has been enrolled. Dev team is aware of this issue and a fix is forthcoming. A safeguard has been implemented to prevent this issue from occurring accidentally but, in the immediate term, developers are advised to avoid re-enrolling ZSM credentials after Passkeys+ credentials have been enrolled.
11
+ - None at this time.
13
12
 
14
13
  ----
14
+ ## Release 2.6.2 - December 19, 2025 [ NPM PACKAGE RELEASE ] **[ LATEST ]**
15
+ - Hotfix release to address an issue with the Passkeys+ plugin integration.
15
16
 
16
- ## Release 2.5.0 - Aug 29, 2025 [ NPM PACKAGE RELEASE ] **[ LATEST ]**
17
+ ## Release 2.6.1 - December 16, 2025 [ NPM PACKAGE RELEASE ]
18
+ - Minor bug fixes and improvements
19
+ - Minor alteration to initialization process to remove the need to provide a `userIdentifier` when initializing (all method calls now provide the update).
20
+ - Improvements to EventCoordinator:
21
+ - Streamlined onReset to ensure that all events are set to "PENDING" state.
22
+ - Improved onReady handling to ensure accurate state representation.
23
+ - Enhanced error handling and reporting mechanisms.
24
+ - Improvements to NPM packaging and distribution process for use with additional package managers and build tools.
25
+ - Reduced complexity of `zsm_app_config.json` file by:
26
+ - Removing _necessity_ of `use_passkeys` and `use_origin` properties (now auto-detected based on environment and browser capabilities).
27
+ - Simplifying host URL configuration down to a `region` property; host URLs are now auto-generated based on region although previous syntax is still supported for backward compatibility.
28
+
29
+ ## Release 2.6.0 - November 26, 2025 [ NPM PACKAGE RELEASE ]
30
+ - Support of updated Passkeys plugin that provides migration scenarios for ZSM to Passkeys+ and boostrapping of new device using existing passkey.
31
+
32
+ ## Release 2.5.1 - October 6, 2025 [ NPM PACKAGE RELEASE ]
33
+ - Minor improvements
34
+
35
+ ## Release 2.5.0 - Aug 29, 2025 [ NPM PACKAGE RELEASE ]
17
36
  - Significant re-architecture of the SDK to improve performance and maintainability (non-breaking, but may alter existing implementations, if plugins are used)
18
37
  - Introduction of a new plugin system for easier integration of additional Ideem services
19
38
  - Plugin system allows for dynamic loading and unloading of features
@@ -52,6 +52,13 @@ class EventCoordinator {
52
52
  set coreReady(value) { this.coreSDKClass.ready = !!value; }
53
53
  set coreErrs(value) { this.coreSDKClass.containsErrors = !!value; }
54
54
 
55
+ /**
56
+ * @name setCoreSDKClass
57
+ * @description Sets the core SDK class reference on the EventCoordinator instance, and defines its "finished" method.
58
+ * @param {string} classDesc The name of the client class being initialized (UMFAClient or FIDO2Client).
59
+ * @param {Object} classRef The reference to the core SDK class being initialized.
60
+ * @returns {void}
61
+ */
55
62
  setCoreSDKClass(classDesc, classRef) {
56
63
  const core = (this.coreSDKClass = classRef); // Set a reference to the core class on the singleton instance, then...
57
64
  core.ready = false; // ... set its default ready state to false
@@ -63,6 +70,12 @@ class EventCoordinator {
63
70
  this.specifyClient(classDesc); // ... finally, specify the client class that is being initialized.
64
71
  }
65
72
 
73
+ /**
74
+ * @name specifyClient
75
+ * @description Specifies the active client class (UMFAClient or FIDO2Client) being initialized.
76
+ * @param {string} selectedClient The name of the client class being initialized (UMFAClient or FIDO2Client).
77
+ * @returns {void}
78
+ */
66
79
  specifyClient(selectedClient) {
67
80
  if (!selectedClient || typeof selectedClient !== 'string' || !selectedClient.length)
68
81
  throw new TypeError(`[ZSM EventCoordinator] :: specifyClient :: Invalid 'selectedClient' value: "${selectedClient}". 'selectedClient' is required and expects a String.`);
@@ -74,6 +87,12 @@ class EventCoordinator {
74
87
  }
75
88
  }
76
89
 
90
+ /**
91
+ * @name summarizeEventStack
92
+ * @description Logs a summary of the current event stack to the console.
93
+ * @param {...any} triggerData Additional data to include in the log (e.g., the event that triggered the update).
94
+ * @returns {void}
95
+ */
77
96
  summarizeEventStack (...triggerData) {
78
97
  let summaryObject = this.object,
79
98
  { client, containsErrors, done } = this;
@@ -102,6 +121,14 @@ class EventCoordinator {
102
121
  GLOBAL.dispatchEvent(new CustomEvent(eventName, { detail: eventDetail }));
103
122
  }
104
123
 
124
+ /**
125
+ * @name update
126
+ * @description Updates the status of a specific event in the event stack.
127
+ * @param {string} classDesc The name of the event to update.
128
+ * @param {string} eventStatus The new status for the event (accepts: UNREGISTERED, PENDING, READY, ERROR).
129
+ * @throws {TypeError} If the classDesc is invalid or eventStatus is not one of the allowed values.
130
+ * @returns {Object} Returns the updated event stack object.
131
+ */
105
132
  update (classDesc, eventStatus="PENDING") {
106
133
  if (!classDesc || typeof classDesc !== 'string' || !classDesc.length)
107
134
  throw new TypeError(`[ZSM EventCoordinator] :: update :: Invalid 'classDesc' value: "${classDesc}". 'classDesc' is required and expects a String.`);
@@ -175,7 +202,7 @@ class EventCoordinator {
175
202
  * @returns {Object} Returns the reset event stack object.
176
203
  */
177
204
  reset() {
178
- this._eventStack = new Map(this.cleanState);
205
+ this._eventStack.keys().forEach(key=>this._eventStack.set(key,'PENDING'));
179
206
  if(window && window?.queueMicrotask) {
180
207
  queueMicrotask(() => this.dispatchEvent('ZSMClientEventStackReset', { stack: this.object }));
181
208
  } else this.dispatchEvent('ZSMClientEventStackReset', { stack: this.object });
@@ -8,7 +8,7 @@ class FIDO2ClientBase {
8
8
  * @param {Object} config - The configuration for the FIDO2Client
9
9
  */
10
10
  constructor(config) {
11
- if(eventCoordinator.done) eventCoordinator.reset();
11
+ eventCoordinator.reset();
12
12
  eventCoordinator.update('FIDO2ClientBase');
13
13
  this.config = config;
14
14
  const WebAuthnClient = zsmPluginManager.classes('WEBAUTHNCLIENT');
package/README.md CHANGED
@@ -19,7 +19,7 @@ TypeScript. These resources include documentation and example applications.
19
19
  Ideem support, <a href="mailto:support@useideem.com">support@useideem.com</a>, to obtain a unique Application ID.
20
20
 
21
21
  ### Documentation
22
- Documentation for this SDK can be found at: https://docs.useideem.com/sdk/browser/index.html. The documentation covers interfaces provided for FIDO2 Authenticator and Universal MFA integrations.
22
+ Documentation for this SDK can be found at: https://docs.useideem.com/pkp. The documentation covers interfaces provided for FIDO2 Authenticator and Universal MFA integrations.
23
23
 
24
24
  ### Demos
25
25
  You can view demos of the FIDO2 Authenticator and Universal MFA Capabilities online at <a href="https://demo.useideem.com">https://demo.useideem.com</a>.
@@ -34,4 +34,4 @@ You can receive support and get your questions answered by emailing <a href="mai
34
34
  Please refer to the LICENSE file in this directory for the license governing the use of this SDK.
35
35
 
36
36
  ### Release Notes
37
- Please refer to the RELEASE_NOTES.txt file in this directory for the release notes of this SDK.
37
+ Please refer to the CHANGELOG.md file in this directory for the release notes of this SDK.
package/UMFAClientBase.js CHANGED
@@ -8,6 +8,7 @@ class UMFAClientBase {
8
8
  * @param {Object} config - The configuration for ZSM initialization (ref: ./zsm_app_config.json)
9
9
  */
10
10
  constructor(config) {
11
+ eventCoordinator.reset();
11
12
  eventCoordinator.update('UMFAClientBase');
12
13
  this.config = config;
13
14
  const WebAuthnClient = zsmPluginManager.classes('WEBAUTHNCLIENT');
@@ -22,7 +22,12 @@ class WebAuthnClientBase {
22
22
  // Helper function to standardize URL format (ensuring it's parsable and ends with a '/')
23
23
  const cleanURL = (url) => URL.canParse(url) ? new URL(url).origin + '/' : false;
24
24
 
25
- const baseConfig = {
25
+ if(config?.region){
26
+ config.authenticator_host_url ||= config.authenticator_host = `https://zsm-authenticator-${config.region}.useideem.com/`;
27
+ config.zsm_host_url ||= config.zsm_host = `https://zsm-${config.region}.useideem.com/`;
28
+ }
29
+
30
+ const baseConfig = {
26
31
  "application_id" : "",
27
32
  "api_key" : "",
28
33
  "host_url" : "https://zsm-authenticator-demo.useideem.com/",
@@ -30,9 +35,15 @@ class WebAuthnClientBase {
30
35
  "log_level" : 'Debug',
31
36
  "request_timeout_ms" : 300000,
32
37
  "retry_count" : 0,
33
- "consumer_id" : ""
38
+ "consumer_id" : "",
39
+ "use_passkeys" : true
34
40
  };
35
41
 
42
+ if(config?.use_passkeys===false || config?.use_origin===false){
43
+ delete config.use_passkeys;
44
+ delete config.use_origin;
45
+ }
46
+
36
47
  this.zsmApi = undefined; // The ZSM API instance (read: WASM-driven Crypto Module)
37
48
  this.relyingParty = undefined; // The Relying Party instance (read: ZSM Authenticator API)
38
49
  this.status = undefined; // The status of the WebAuthnClientBase
@@ -108,7 +119,6 @@ class WebAuthnClientBase {
108
119
  */
109
120
  async initializeZsm () {
110
121
  if(GLOBAL.mpcConfig.consumer_id !== this.MPCConfig.consumer_id) {
111
- // console.log('GLOBAL.mpcConfig :', Object.assign({},GLOBAL.mpcConfig));
112
122
  await this.zsmApi.configure(GLOBAL.mpcConfig);
113
123
  this.MPCConfig = await Object.assign({}, GLOBAL.mpcConfig);
114
124
  await uid2iid(this.config.consumer_id, this.MPCConfig.consumer_id);
@@ -127,7 +137,10 @@ class WebAuthnClientBase {
127
137
  */
128
138
 
129
139
  async checkIdentity (userIdentifier, primeEnroll=false) {
130
-
140
+ if(userIdentifier == null
141
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: checkIdentity :: A userIdentifier String is required! Received: ${userIdentifier}.`);
142
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
143
+
131
144
  try {
132
145
  const resultOfCheck = await this.relyingParty.checkServerSideIdentity(primeEnroll);
133
146
 
@@ -156,6 +169,9 @@ class WebAuthnClientBase {
156
169
  * @throws {Error} Throws a COUNTED error if unable to verify the credential with the Relying Party Server.
157
170
  */
158
171
  async webauthnCreate (userIdentifier) {
172
+ if(userIdentifier == null
173
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: webauthnCreate :: A userIdentifier String is required! Received: ${userIdentifier}.`);
174
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
159
175
 
160
176
  await this.initializeZsm('webauthnCreate');
161
177
 
@@ -200,22 +216,25 @@ class WebAuthnClientBase {
200
216
  * @throws {Error} Throws an error if the user ID or token is missing from the response body.
201
217
  */
202
218
  async webauthnCreateMpcThenFinish (userIdentifier, publicKey, pairing_token) {
219
+ if(userIdentifier == null
220
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: webauthnCreateMpcThenFinish :: A userIdentifier String is required! Received: ${userIdentifier}.`);
221
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
203
222
  this.status = 'ENROLLMENT_STARTING';
204
- await this.initializeZsm('webauthnCreate');
223
+ await this.initializeZsm('webauthnCreateMpcThenFinish');
205
224
 
206
225
  let createResponse = await this.zsmApi.webauthn_create(publicKey, pairing_token, userIdentifier, tracePrimer());
207
- if(!createResponse) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreate :: Unable to obtain response from Crypto Server!');
226
+ if(!createResponse) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreateMpcThenFinish :: Unable to obtain response from Crypto Server!');
208
227
 
209
228
  createResponse = toObject(createResponse);
210
229
  GLOBAL.dispatchEvent(new CustomEvent("MPCResponse", {bubbles: true, cancelable: false, detail: createResponse }));
211
230
 
212
- if(!createResponse?.result) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreate :: Unable to obtain credential from Crypto Server!');
213
- if(!createResponse?.result?.response) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreate :: Unable to acquire attestation object!');
231
+ if(!createResponse?.result) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreateMpcThenFinish :: Unable to obtain credential from Crypto Server!');
232
+ if(!createResponse?.result?.response) throw new Error('[WebAuthnClient - mpc_round] :: webauthnCreateMpcThenFinish :: Unable to acquire attestation object!');
214
233
 
215
234
  const credential = createResponse.result;
216
235
 
217
236
  const registrationResult = await this.relyingParty.registrationFinish(credential);
218
- if (!registrationResult) throw new Error('[WebAuthnClient] :: webauthnCreate :: Unable to verify credential Relying Party Server!');
237
+ if (!registrationResult) throw new Error('[WebAuthnClient] :: webauthnCreateMpcThenFinish :: Unable to verify credential Relying Party Server!');
219
238
 
220
239
  return registrationResult.credential;
221
240
  };
@@ -233,6 +252,9 @@ class WebAuthnClientBase {
233
252
  * @throws {Error} Throws an error if the user ID or token is missing from the response body.
234
253
  */
235
254
  async webauthnGet (userIdentifier) {
255
+ if(userIdentifier == null
256
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: webauthnGet :: A userIdentifier String is required! Received: ${userIdentifier}.`);
257
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
236
258
 
237
259
  await this.initializeZsm('webauthnGet');
238
260
  const credentialId = await this.webauthnRetrieve(userIdentifier, true);
@@ -296,6 +318,9 @@ class WebAuthnClientBase {
296
318
  * @throws {Error} Throws an error if an uncaught/unhandled error occurs while retrieving the credential.
297
319
  */
298
320
  async webauthnRetrieve (userIdentifier) {
321
+ if(userIdentifier == null
322
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: webauthnRetrieve :: A userIdentifier String is required! Received: ${userIdentifier}.`);
323
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
299
324
  this.credentialID = null;
300
325
 
301
326
  this.initializeZsm('webauthnRetrieve');
@@ -311,39 +336,6 @@ class WebAuthnClientBase {
311
336
  this.credentialID = response?.result['zsm_credential_id']??null;
312
337
  return this.credentialID || false;
313
338
  };
314
- // async webauthnRetrieve (userIdentifier, targetData='id') {
315
- // this.credentialID = null;
316
- //
317
- // this.initializeZsm('webauthnRetrieve');
318
- // let credentialIdentifier = await iid4uid(userIdentifier),
319
- // requestedData = {};
320
- // GLOBAL.mpcConfig.consumer_id = credentialIdentifier;
321
- //
322
- // let response = await this.zsmApi.webauthn_retrieve(userIdentifier);
323
- // response = toObject(response);
324
- //
325
- // if (response?.error || !response?.result) return false;
326
- //
327
- // this.credentialID = response?.result['zsm_credential_id']??null;
328
- //
329
- // if([undefined,true,false,null,'','id'].includes(targetData)) {
330
- // return this.credentialID;
331
- // }
332
- // let pkpCred = await iid4uid(`pk:${userIdentifier}`);
333
- // if(pkpCred === `pk:${userIdentifier}`) pkpCred = undefined;
334
- // requestedData = {
335
- // userIdentifier,
336
- // zsmCredID : this.credentialID,
337
- // hasZSMCred : (this.credentialID != null),
338
- // pkpCredID : pkpCred,
339
- // hasLocalPasskey : (typeof pkpCred === 'string' && pkpCred !== ''),
340
- // hasRemotePasskey : (typeof pkpCred === 'object')
341
- // };
342
- // if (targetData === "all") {
343
- // return requestedData;
344
- // }
345
- // return response?.[targetData] ?? response?.result?.[targetData] ?? requestedData?.[targetData] ?? null;
346
- // };
347
339
 
348
340
  /**
349
341
  * @name webauthnPartialGet
@@ -357,6 +349,9 @@ class WebAuthnClientBase {
357
349
  * @emits {CustomEvent} Emits a "MPCResponse" event with the mpcResponse data.
358
350
  */
359
351
  async webauthnPartialGet (userIdentifier) {
352
+ if(userIdentifier == null
353
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: webauthnPartialGet :: A userIdentifier String is required! Received: ${userIdentifier}.`);
354
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
360
355
  this.status = 'AUTHENTICATION_STARTING';
361
356
  await this.initializeZsm('webauthnPartialGet');
362
357
 
@@ -399,6 +394,9 @@ class WebAuthnClientBase {
399
394
  * @throws {Error<UnenrollError>} Throws an UnenrollError if a credential matching userIdentifier IS stored on the device, but was unable to be removed.
400
395
  */
401
396
  async unbindFromDevice (userIdentifier) {
397
+ if(userIdentifier == null
398
+ || userIdentifier === '') return new Error(`[WebAuthnClient] :: unbindFromDevice :: A userIdentifier String is required! Received: ${userIdentifier}.`);
399
+ if(userIdentifier && typeof userIdentifier === 'string') this.userIdentifier = userIdentifier;
402
400
  this.status = 'UNENROLL_STARTING';
403
401
  if(userIdentifier !== this.userIdentifier) return false;
404
402
  await this.initializeZsm('unbindFromDevice');
package/package.json CHANGED
@@ -1,72 +1,70 @@
1
1
  {
2
- "name": "@ideem/zsm-client-sdk",
3
- "version": "2.6.0",
4
- "description": "ZSM makes 2FA easy and invisible for everyone, all the time, using advanced cryptography like MPC to establish cryptographic proof of the origin of any transaction or login attempt, while eliminating opportunities for social engineering. ZSM has no reliance on specific hardware. Our cryptographic module has completed FIPS 140-3 NIST approved lab testing, is FIDO2-ready, and is on the Modules In Progress (MIP) list. Superior Usability. no opt-in, no codes, no downloads, no authenticator apps. Better Security.",
5
- "author": "@JJ (Jason Jurusz) <jj@useideem.com>/<nerdy.deeds@done.cheap>",
6
- "keywords": [
7
- "ideem",
8
- "zsm",
9
- "zsm-client-sdk",
10
- "UMFAClient",
11
- "FIDO2Client",
12
- "library",
13
- "UMFA",
14
- "FIDO2",
15
- "client",
16
- "authentication",
17
- "javascript",
18
- "multi-factor",
19
- "webauthn",
20
- "authentication",
21
- "security",
22
- "cryptography",
23
- "MPC",
24
- "FIPS",
25
- "NIST",
26
- "FIDO2-ready",
27
- "Modules In Progress",
28
- "MIP"
29
- ],
30
- "type": "module",
31
- "main": "./ZSMClientSDK.js",
32
- "scripts": {
33
- "start": "echo 'This is the Ideem SDK library, not a freestanding application. There is no start script defined. To use, import the library into a browser application.' 1>&2",
34
- "version": "echo \"$(npm pkg get name | tr -d \\\") current version: $(npm pkg get version | tr -d \\\")\""
35
- },
36
- "collaborators": [
37
- "Joel Teply <joel@useideem.com>",
38
- "Todd Decker <todd@useideem.com>",
39
- "Brian Koziel <brian@useideem.com>"
40
- ],
41
- "license": "SEE LICENSE IN LICENSE",
42
- "repository": {
43
- "type": "git",
44
- "url": "github : useideem/vHSM"
45
- },
46
- "homepage": "https://useideem.com",
47
- "bugs": "https://github.com/useideem/vHSM/issues",
48
- "files": [
49
- "./ErrorHandler.js",
50
- "./EventCoordinator.js",
51
- "./FIDO2Client.js",
52
- "./FIDO2ClientBase.js",
53
- "./GlobalScoping.js",
54
- "./IdentityIndexing.js",
55
- "./package.json",
56
- "./PluginManager.js",
57
- "./RelyingParty.js",
58
- "./RelyingPartyBase.js",
59
- "./shims/",
60
- "./UMFAClient.js",
61
- "./UMFAClientBase.js",
62
- "./Utils.js",
63
- "./WASMRustInterface.js",
64
- "./WebAuthnClient.js",
65
- "./WebAuthnClientBase.js",
66
- "./ZSMClientSDK.js",
67
- "./CHANGELOG.md",
68
- "./LICENSE",
69
- "./README.md"
70
- ],
71
- "sideEffects": false
2
+ "name" : "@ideem/zsm-client-sdk",
3
+ "version" : "2.6.2",
4
+ "description" : "ZSM makes 2FA easy and invisible for everyone, all the time, using advanced cryptography like MPC to establish cryptographic proof of the origin of any transaction or login attempt, while eliminating opportunities for social engineering. ZSM has no reliance on specific hardware. Our cryptographic module has completed FIPS 140-3 NIST approved lab testing, is FIDO2-ready, and is on the Modules In Progress (MIP) list. Superior Usability. no opt-in, no codes, no downloads, no authenticator apps. Better Security.",
5
+ "author" : "Jason Jurusz <jj@useideem.com>",
6
+ "keywords" : [ "ideem", "zsm", "zsm-client-sdk", "umfaclient", "fido2client", "library", "umfa", "fido", "fido2", "client", "javascript", "multifactor", "multi-factor", "webauthn", "authentication", "security", "cryptography", "mpc", "fips", "nist", "mip", "passkeys" ],
7
+ "type" : "module",
8
+ "main" : "./ZSMClientSDK.js",
9
+ "exports" : {
10
+ "." : "./ZSMClientSDK.js",
11
+ "./*" : "./*.js",
12
+ "./*.js" : "./*.js"
13
+ },
14
+
15
+ "scripts" : {
16
+ "start" : "echo 'This is the Ideem SDK library, not a freestanding application. There is no start script defined. To use, import the library into a browser application.' 1>&2",
17
+ "showVersion" : "echo \"$(npm pkg get name | tr -d \\\") current version: $(npm pkg get version | tr -d \\\")\""
18
+ },
19
+ "collaborators" : [
20
+ "Joel Teply <joel@useideem.com>",
21
+ "Todd Decker <todd@useideem.com>",
22
+ "Brian Koziel <brian@useideem.com>"
23
+ ],
24
+ "license" : "LicenseRef-Ideem",
25
+ "repository" : {
26
+ "type" : "git",
27
+ "url" : "git+https://github.com/useideem/vHSM.git"
28
+ },
29
+ "homepage" : "https://useideem.com",
30
+ "bugs" : "https://github.com/useideem/vHSM/issues",
31
+ "files" : [
32
+ "./shims/",
33
+ "./ErrorHandler.js",
34
+ "./EventCoordinator.js",
35
+ "./FIDO2Client.js",
36
+ "./FIDO2ClientBase.js",
37
+ "./GlobalScoping.js",
38
+ "./IdentityIndexing.js",
39
+ "./PluginManager.js",
40
+ "./RelyingParty.js",
41
+ "./RelyingPartyBase.js",
42
+ "./UMFAClient.js",
43
+ "./UMFAClientBase.js",
44
+ "./Utils.js",
45
+ "./WASMRustInterface.js",
46
+ "./WebAuthnClient.js",
47
+ "./WebAuthnClientBase.js",
48
+ "./ZSMClientSDK.js",
49
+ "./CHANGELOG.md",
50
+ "./LICENSE",
51
+ "./README.md"
52
+ ],
53
+ "sideEffects" : [
54
+ "./EventCoordinator.js",
55
+ "./FIDO2Client.js",
56
+ "./FIDO2ClientBase.js",
57
+ "./GlobalScoping.js",
58
+ "./IdentityIndexing.js",
59
+ "./PluginManager.js",
60
+ "./RelyingParty.js",
61
+ "./RelyingPartyBase.js",
62
+ "./UMFAClient.js",
63
+ "./UMFAClientBase.js",
64
+ "./Utils.js",
65
+ "./WASMRustInterface.js",
66
+ "./WebAuthnClient.js",
67
+ "./WebAuthnClientBase.js",
68
+ "./ZSMClientSDK.js"
69
+ ]
72
70
  }