verant_id_cloud_scan 1.4.5-beta.4 → 1.4.5-beta.6

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/Api.js CHANGED
@@ -4,47 +4,98 @@ import { FIELD_MAPPING, FIELD_DEFAULTS, getFieldValue } from "./FieldMapping.js"
4
4
  import { sanitizeFieldForDmv } from "./FormatUtils.js";
5
5
 
6
6
  /**
7
- * Environment Detection
7
+ * Environment Detection & Management
8
8
  *
9
- * Automatically detects staging vs production based on hostname.
10
- * Defaults to PRODUCTION for backwards compatibility with existing customers.
11
- * Only switches to staging for VerantID's own staging domains.
9
+ * Defaults to PRODUCTION for all hosts (including localhost).
10
+ * Only verify-staging.verantid.com automatically uses staging.
11
+ * Host apps can explicitly override via setEnvironment('staging' | 'production').
12
12
  */
13
- function getEnvironment() {
14
- // Default to production for safety and backwards compatibility
13
+
14
+ // Current environment - starts as null to trigger detection on first use
15
+ let currentEnvironment = null;
16
+
17
+ /**
18
+ * Detect environment based on hostname
19
+ * @returns {'staging' | 'production'}
20
+ */
21
+ function detectEnvironment() {
22
+ // Default to production for all hosts
15
23
  let environment = 'production';
16
24
 
17
- // Only override to staging if explicitly on a VerantID staging domain
25
+ // Only auto-switch to staging for VerantID's staging domain
18
26
  if (typeof window !== 'undefined') {
19
27
  const hostname = window.location.hostname;
20
28
 
21
- // ONLY switch to staging for VerantID's own staging domains
22
- if (hostname === 'verify-staging.verantid.com' ||
23
- hostname === 'localhost' ||
24
- hostname === '127.0.0.1' ||
25
- hostname.startsWith('localhost:')) {
29
+ // ONLY verify-staging.verantid.com uses staging by default
30
+ if (hostname === 'verify-staging.verantid.com') {
26
31
  environment = 'staging';
27
32
  }
28
33
 
29
- // All other hostnames (customer sites, verify.verantid.com, etc.) use production
34
+ // All other hostnames (localhost, customer sites, verify.verantid.com, etc.) use production
30
35
  }
31
36
 
32
37
  console.log('[CloudScan] Environment detected:', environment, 'on', typeof window !== 'undefined' ? window.location.hostname : 'server');
33
38
  return environment;
34
39
  }
35
40
 
36
- const env = getEnvironment();
41
+ /**
42
+ * Get current environment (detects if not already set)
43
+ * @returns {'staging' | 'production'}
44
+ */
45
+ function getEnvironment() {
46
+ if (currentEnvironment === null) {
47
+ currentEnvironment = detectEnvironment();
48
+ }
49
+ return currentEnvironment;
50
+ }
37
51
 
38
- const licenseServerAddress = env === 'staging'
39
- ? "https://lic-staging.verantid.com/api/v1"
40
- : "https://lic.verantid.com/api/v1";
52
+ /**
53
+ * Explicitly set the environment
54
+ * @param {'staging' | 'production'} environment
55
+ * @throws {Error} If environment is not 'staging' or 'production'
56
+ */
57
+ export function setEnvironment(environment) {
58
+ if (environment !== 'staging' && environment !== 'production') {
59
+ throw new Error(`Invalid environment: "${environment}". Must be "staging" or "production".`);
60
+ }
61
+ currentEnvironment = environment;
62
+ }
63
+
64
+ /**
65
+ * Get license server address based on current environment
66
+ * @returns {string}
67
+ */
68
+ function getLicenseServerAddress() {
69
+ const env = getEnvironment();
70
+ return env === 'staging'
71
+ ? "https://lic-staging.verantid.com/api/v1"
72
+ : "https://lic.verantid.com/api/v1";
73
+ }
74
+
75
+ /**
76
+ * Get DMV server address based on current environment
77
+ * @returns {string}
78
+ */
79
+ function getDmvServerAddress() {
80
+ const env = getEnvironment();
81
+ return env === 'staging'
82
+ ? "https://dmv-check-server-staging-fcaab48bec21.herokuapp.com/api/v1/dmv_check"
83
+ : "https://dmv.verantid.com/api/v1/dmv_check";
84
+ }
41
85
 
42
- const dmvServerAddress = env === 'staging'
43
- ? "https://dmv-check-server-staging-fcaab48bec21.herokuapp.com/api/v1/dmv_check"
44
- : "https://dmv.verantid.com/api/v1/dmv_check";
86
+ /**
87
+ * Get Face Comparison server address based on current environment
88
+ * @returns {string}
89
+ */
90
+ export function getFaceComparisonServerAddress() {
91
+ const env = getEnvironment();
92
+ return env === 'staging'
93
+ ? "https://staging.face.verantid.bluerocket.us/compare_id_and_face"
94
+ : "https://faceid.verantid.com/compare_id_and_face";
95
+ }
45
96
 
46
97
  export const dmvCheck = async (clientId, scannerType, licenseData) => {
47
- const url = dmvServerAddress;
98
+ const url = getDmvServerAddress();
48
99
 
49
100
  // Build the driver object dynamically.
50
101
  const driver = {};
@@ -135,7 +186,7 @@ export const dmvCheck = async (clientId, scannerType, licenseData) => {
135
186
  };
136
187
 
137
188
  export const checkDmvFeatureLicense = async (clientId) => {
138
- const url = licenseServerAddress + "/dmv_verifications/check_license";
189
+ const url = getLicenseServerAddress() + "/dmv_verifications/check_license";
139
190
  const data = { client_id: clientId };
140
191
 
141
192
  try {
@@ -169,7 +220,7 @@ export const checkDmvFeatureLicense = async (clientId) => {
169
220
  };
170
221
 
171
222
  export const checkFaceComparisonFeatureLicense = async (clientId) => {
172
- const url = licenseServerAddress + "/facial_scans/check_license";
223
+ const url = getLicenseServerAddress() + "/facial_scans/check_license";
173
224
  const data = { client_id: clientId };
174
225
 
175
226
  try {
@@ -203,7 +254,7 @@ export const checkFaceComparisonFeatureLicense = async (clientId) => {
203
254
  }
204
255
 
205
256
  export const checkLicense = async (clientId, macAddress) => {
206
- const url = licenseServerAddress + "/check_license";
257
+ const url = getLicenseServerAddress() + "/check_license";
207
258
  const data = { client_id: clientId, mac_address: macAddress };
208
259
 
209
260
  try {
@@ -238,7 +289,7 @@ export const checkLicense = async (clientId, macAddress) => {
238
289
  * @returns {Promise<boolean>} True if autoDmv is enabled
239
290
  */
240
291
  export const checkAutoDmvEnabled = async (clientId) => {
241
- const url = licenseServerAddress + "/check_feature_license";
292
+ const url = getLicenseServerAddress() + "/check_feature_license";
242
293
  const data = { client_id: clientId };
243
294
 
244
295
  try {
@@ -263,7 +314,7 @@ export const checkAutoDmvEnabled = async (clientId) => {
263
314
  }
264
315
  };
265
316
  export const getBarcodeLicenseKey = async () => {
266
- const url = licenseServerAddress + "/get_barcode_license_key";
317
+ const url = getLicenseServerAddress() + "/get_barcode_license_key";
267
318
 
268
319
  try {
269
320
  const response = await fetch(url, {
package/CHANGELOG.md ADDED
@@ -0,0 +1,66 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.4.5-beta.6] - 2026-04-15
9
+
10
+ ### Added
11
+ - UV/IR image support for IDXpressPlus scanner profile
12
+ - Added `licenseFrontUvBase64`, `licenseBackUvBase64`, `licenseFrontIrBase64`, and `licenseBackIrBase64` fields to scan results
13
+ - Scanner now captures and returns ultraviolet (UV) and infrared (IR) images alongside standard color images
14
+ - Image types supported: fclr (front color), rclr (rear color), fclruv (front UV), rclruv (rear UV), fgsir (front IR), rgsir (rear IR)
15
+
16
+ ### Fixed
17
+ - UV/IR parameters no longer restored to disabled state after scanning
18
+ - Removed `fclrUvEnabled`, `rclrUvEnabled`, `fgsIrEnabled`, and `rgsIrEnabled` from `restoreParamKeys` in IDXpressPlus profile
19
+ - Image extraction logic now captures all image types from scanner response instead of only front/back color images
20
+
21
+ ### Changed
22
+ - Updated `ScannerApi.js` to extract UV/IR images from GetDocument response
23
+ - Updated `CloudScan.js` public API functions (`scanId`, `localScanId`, `localContinueScanId`) to return UV/IR image data
24
+
25
+ ## [1.4.5-beta.5] - 2026-04-14
26
+
27
+ ### Changed
28
+ - Applied dynamic environment URLs to face comparison feature
29
+
30
+ ## [1.4.5-beta.4] - 2026-04-14
31
+
32
+ ### Added
33
+ - Error validation for invalid environment type
34
+
35
+ ### Changed
36
+ - Updated default server URLs to production endpoints
37
+
38
+ ## [1.4.5-beta.3] - 2026-04-13
39
+
40
+ ### Fixed
41
+ - Various bug fixes and code quality improvements
42
+
43
+ ## [1.4.5-beta.2] - 2026-04-12
44
+
45
+ ### Added
46
+ - Dynamic environment detection for server URLs
47
+ - Support for multiple deployment environments
48
+
49
+ ### Changed
50
+ - Server address handling now supports trailing slashes
51
+ - Code improvements based on Copilot suggestions
52
+
53
+ ## [1.4.5-beta.1] - 2026-04-11
54
+
55
+ ### Added
56
+ - IDXpress scanner profiles support
57
+ - New scanner profile configuration options
58
+
59
+ ---
60
+
61
+ ## Version Number Guide
62
+
63
+ - **Major** (1.x.x): Breaking changes
64
+ - **Minor** (x.4.x): New features, backwards compatible
65
+ - **Patch** (x.x.5): Bug fixes, backwards compatible
66
+ - **Beta** (x.x.x-beta.x): Pre-release versions for testing
package/CloudScan.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  scannerPresent,
16
16
  } from "./ScannerApi.js";
17
17
  import { VerificationModal } from "./VerificationModal.js";
18
- import { checkAutoDmvEnabled } from "./Api.js";
18
+ import { checkAutoDmvEnabled, setEnvironment } from "./Api.js";
19
19
  import { formatSexCodeForDisplay, formatHeightForDisplay } from "./FormatUtils.js";
20
20
 
21
21
  let cachedLicenseFrontBase64 = "";
@@ -36,7 +36,7 @@ export const checkFaceCompareFeature = async (clientId) => {
36
36
  return await checkFaceComparisonFeatureLicense(clientId);
37
37
  }
38
38
 
39
- export { scannerPresent };
39
+ export { scannerPresent, setEnvironment };
40
40
 
41
41
  export async function readImageBarcode(imageFile, clientId = null, scannerType = 'Upload') {
42
42
  let returnObj = {
@@ -119,6 +119,10 @@ export const scanId = async (
119
119
  barcodeResultsObject,
120
120
  licenseFrontBase64: "",
121
121
  licenseBackBase64: "",
122
+ licenseFrontUvBase64: "",
123
+ licenseBackUvBase64: "",
124
+ licenseFrontIrBase64: "",
125
+ licenseBackIrBase64: "",
122
126
  errorMessages: "",
123
127
  };
124
128
  let barcodelicenseKey = await getBarcodeLicenseKey();
@@ -148,6 +152,10 @@ export const scanId = async (
148
152
 
149
153
  returnObj.licenseFrontBase64 = scannerResponseObj.licenseFrontBase64;
150
154
  returnObj.licenseBackBase64 = scannerResponseObj.licenseBackBase64;
155
+ returnObj.licenseFrontUvBase64 = scannerResponseObj.licenseFrontUvBase64;
156
+ returnObj.licenseBackUvBase64 = scannerResponseObj.licenseBackUvBase64;
157
+ returnObj.licenseFrontIrBase64 = scannerResponseObj.licenseFrontIrBase64;
158
+ returnObj.licenseBackIrBase64 = scannerResponseObj.licenseBackIrBase64;
151
159
 
152
160
  if (includeData && scannerResponseObj.licenseBackBase64) {
153
161
  var img = document.createElement("img");
@@ -357,6 +365,10 @@ export const localScanId = async (scannerAddress, clientId) => {
357
365
  barcodeResultsObject,
358
366
  licenseFrontBase64: "",
359
367
  licenseBackBase64: "",
368
+ licenseFrontUvBase64: "",
369
+ licenseBackUvBase64: "",
370
+ licenseFrontIrBase64: "",
371
+ licenseBackIrBase64: "",
360
372
  errorMessages: "",
361
373
  };
362
374
 
@@ -381,6 +393,10 @@ export const localContinueScanId = async (scannerAddress, includeData, clientId
381
393
  barcodeResultsObject,
382
394
  licenseFrontBase64: "",
383
395
  licenseBackBase64: "",
396
+ licenseFrontUvBase64: "",
397
+ licenseBackUvBase64: "",
398
+ licenseFrontIrBase64: "",
399
+ licenseBackIrBase64: "",
384
400
  errorMessages: "",
385
401
  };
386
402
 
package/FaceComparison.js CHANGED
@@ -1,7 +1,4 @@
1
- //prod
2
- const faceComparisonAddress = "https://faceid.verantid.com/compare_id_and_face";
3
- //staging
4
- // const faceComparisonAddress = "https://staging.face.verantid.bluerocket.us/compare_id_and_face";
1
+ import { getFaceComparisonServerAddress } from "./Api.js";
5
2
 
6
3
 
7
4
  export async function compressImage(source, maxSize = 2 * 1024 * 1024) {
@@ -42,6 +39,7 @@ export async function compressImage(source, maxSize = 2 * 1024 * 1024) {
42
39
  }
43
40
 
44
41
  const startComparison = async (commandObj) => {
42
+ const faceComparisonAddress = getFaceComparisonServerAddress();
45
43
  return fetch(faceComparisonAddress, {
46
44
  method: "POST",
47
45
  headers: { "Content-Type": "application/json" },
package/ScannerApi.js CHANGED
@@ -178,11 +178,19 @@ export async function scannerChain(
178
178
  scanDataResults: resultData,
179
179
  licenseFrontBase64: frontBase64,
180
180
  licenseBackBase64: backBase64,
181
+ licenseFrontUvBase64: frontUvBase64,
182
+ licenseBackUvBase64: backUvBase64,
183
+ licenseFrontIrBase64: frontIrBase64,
184
+ licenseBackIrBase64: backIrBase64,
181
185
  } = await startScanDocument(currentSessionId, profile, optGetDocumentParams);
182
186
 
183
187
  scanDataResults = resultData;
184
188
  licenseFrontBase64 = frontBase64;
185
189
  licenseBackBase64 = backBase64;
190
+ const licenseFrontUvBase64 = frontUvBase64;
191
+ const licenseBackUvBase64 = backUvBase64;
192
+ const licenseFrontIrBase64 = frontIrBase64;
193
+ const licenseBackIrBase64 = backIrBase64;
186
194
 
187
195
  if (!scanSuccess) {
188
196
  await closeScannerConnection(currentSessionId);
@@ -221,6 +229,10 @@ export async function scannerChain(
221
229
  scanDataResults,
222
230
  licenseFrontBase64: licenseFrontBase64,
223
231
  licenseBackBase64: licenseBackBase64,
232
+ licenseFrontUvBase64: licenseFrontUvBase64,
233
+ licenseBackUvBase64: licenseBackUvBase64,
234
+ licenseFrontIrBase64: licenseFrontIrBase64,
235
+ licenseBackIrBase64: licenseBackIrBase64,
224
236
  scannerProfile: profileName,
225
237
  errorMessages,
226
238
  };
@@ -390,16 +402,30 @@ async function startScanDocument(
390
402
  let scanDataResults = responseData;
391
403
  let licenseFrontBase64 = "";
392
404
  let licenseBackBase64 = "";
405
+ let licenseFrontUvBase64 = "";
406
+ let licenseBackUvBase64 = "";
407
+ let licenseFrontIrBase64 = "";
408
+ let licenseBackIrBase64 = "";
393
409
 
394
410
  const images = responseData.Images || [];
395
411
 
396
412
  // Check and set image data using profile-defined image types
397
413
  images.forEach((element) => {
398
- if (element["ImageType"] === profile.frontImageType) {
399
- licenseFrontBase64 = element["data"];
400
- }
401
- if (element["ImageType"] === profile.backImageType) {
402
- licenseBackBase64 = element["data"];
414
+ const imageType = element["ImageType"];
415
+ const imageData = element["data"];
416
+
417
+ if (imageType === profile.frontImageType) {
418
+ licenseFrontBase64 = imageData;
419
+ } else if (imageType === profile.backImageType) {
420
+ licenseBackBase64 = imageData;
421
+ } else if (imageType === "fclruv") {
422
+ licenseFrontUvBase64 = imageData;
423
+ } else if (imageType === "rclruv") {
424
+ licenseBackUvBase64 = imageData;
425
+ } else if (imageType === "fgsir") {
426
+ licenseFrontIrBase64 = imageData;
427
+ } else if (imageType === "rgsir") {
428
+ licenseBackIrBase64 = imageData;
403
429
  }
404
430
  });
405
431
 
@@ -408,6 +434,10 @@ async function startScanDocument(
408
434
  scanDataResults,
409
435
  licenseFrontBase64,
410
436
  licenseBackBase64,
437
+ licenseFrontUvBase64,
438
+ licenseBackUvBase64,
439
+ licenseFrontIrBase64,
440
+ licenseBackIrBase64,
411
441
  };
412
442
  }
413
443
 
@@ -416,6 +446,10 @@ async function startScanDocument(
416
446
  scanDataResults: null,
417
447
  licenseFrontBase64: "",
418
448
  licenseBackBase64: "",
449
+ licenseFrontUvBase64: "",
450
+ licenseBackUvBase64: "",
451
+ licenseFrontIrBase64: "",
452
+ licenseBackIrBase64: "",
419
453
  };
420
454
  }
421
455
 
@@ -80,6 +80,11 @@ const PROFILES = {
80
80
  fclrEnabled: "true",
81
81
  rgsEnabled: "false",
82
82
  rclrEnabled: "true",
83
+ clrUvIrResolution: "600dpi",
84
+ fclrUvEnabled: "true",
85
+ rclrUvEnabled: "true",
86
+ fgsIrEnabled: "true",
87
+ rgsIrEnabled: "true",
83
88
  },
84
89
  restoreParamKeys: [
85
90
  "FeedType",
@@ -93,6 +98,11 @@ const PROFILES = {
93
98
  "rgsEnabled",
94
99
  "rgsResolution",
95
100
  "rclrCompressionQuality",
101
+ "clrUvIrResolution",
102
+ "fclrUvEnabled",
103
+ "rclrUvEnabled",
104
+ "fgsIrEnabled",
105
+ "rgsIrEnabled",
96
106
  ],
97
107
  frontImageType: "fclr",
98
108
  backImageType: "rclr",
package/index.d.ts CHANGED
@@ -77,3 +77,11 @@ declare module "verant_id_cloud_scan" {
77
77
  }
78
78
 
79
79
  export function scannerPresent(scannerAddress: string): Promise<boolean>;
80
+
81
+ /**
82
+ * Explicitly set the API environment.
83
+ * By default, production is used for all hosts (including localhost).
84
+ * Only verify-staging.verantid.com automatically uses staging.
85
+ * @param environment - 'staging' or 'production'
86
+ */
87
+ export function setEnvironment(environment: 'staging' | 'production'): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verant_id_cloud_scan",
3
- "version": "1.4.5-beta.4",
3
+ "version": "1.4.5-beta.6",
4
4
  "description": "Verant ID Cloud Scan NPM Library",
5
5
  "main": "CloudScan.js",
6
6
  "types": "index.d.ts",