react-native-unit-components 3.5.3 → 3.5.4

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.
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.isVeryfiAvailable = exports.configureAndShowVeryfiCamera = void 0;
7
7
  var _reactNative = require("react-native");
8
- var _veryfiService = require("./veryfiService.utils");
9
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
9
  let VeryfiLens = null;
11
10
  try {
@@ -40,9 +39,20 @@ const buildEndorsement = bankName => {
40
39
  return `Please make sure to sign the back and write “For mobile deposit ${bank ? `at ${bank}` : 'only'}”`;
41
40
  };
42
41
 
43
- // How long to hold delivery waiting for Veryfi's parsed result before falling
44
- // back to positional labeling.
45
- const VERDICT_WAIT_MS = 10000;
42
+ // Veryfi reports each capture's side in the update event's `images`, whose
43
+ // order does not track `img_original_paths` — sides are matched by file path.
44
+ // Returns null unless every path resolves, so a partial match falls back to
45
+ // positional labeling rather than producing two fronts.
46
+ const labelsFromEventImages = (imagePaths, eventImages) => {
47
+ if (!Array.isArray(eventImages)) return null;
48
+ const labels = [];
49
+ for (const filePath of imagePaths) {
50
+ const match = eventImages.find(image => image?.path === filePath);
51
+ if (typeof match?.is_front !== 'boolean') return null;
52
+ labels.push(match.is_front);
53
+ }
54
+ return labels;
55
+ };
46
56
  const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError) => {
47
57
  if (!VeryfiLens) {
48
58
  onError('Veryfi SDK is not available');
@@ -53,16 +63,8 @@ const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError)
53
63
  const subscriptions = [];
54
64
  let capturing = false;
55
65
  let dispatched = false;
56
- let convertedImages = null;
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- let verdictPages = null;
59
- let fallbackTimer = null;
60
66
  const cleanup = () => {
61
67
  subscriptions.forEach(sub => sub.remove());
62
- if (fallbackTimer != null) {
63
- clearTimeout(fallbackTimer);
64
- fallbackTimer = null;
65
- }
66
68
  };
67
69
  const dispatchToWeb = images => {
68
70
  if (dispatched) return;
@@ -70,24 +72,7 @@ const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError)
70
72
  cleanup();
71
73
  onImages(images);
72
74
  };
73
-
74
- // Delivery is held briefly so Veryfi's parsed result — the authoritative
75
- // source for which image is the front — can label the pair before the web
76
- // renders it. The positional fallback covers slow or failed uploads;
77
- // position is unreliable across Veryfi versions (the order reversed in
78
- // Android lens 2.4.0.0), which is exactly why the verdict is preferred.
79
- const dispatchWhenReady = () => {
80
- if (dispatched || !convertedImages) return;
81
- if (verdictPages) {
82
- const labeled = (0, _veryfiService.labelSidesFromPages)(convertedImages, verdictPages);
83
- dispatchToWeb(labeled ?? convertedImages);
84
- return;
85
- }
86
- if (fallbackTimer == null) {
87
- fallbackTimer = setTimeout(() => dispatchToWeb(convertedImages), VERDICT_WAIT_MS);
88
- }
89
- };
90
- const convertImages = imagePaths => {
75
+ const convertImages = (imagePaths, labels) => {
91
76
  if (capturing) return;
92
77
  capturing = true;
93
78
  let converted = 0;
@@ -99,8 +84,7 @@ const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError)
99
84
  converted++;
100
85
  if (converted === imagePaths.length) {
101
86
  if (images.length > 0) {
102
- convertedImages = images;
103
- dispatchWhenReady();
87
+ dispatchToWeb(images);
104
88
  } else {
105
89
  cleanup();
106
90
  onError('Failed to convert check images');
@@ -111,12 +95,11 @@ const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError)
111
95
  base64Data => {
112
96
  images.push({
113
97
  base64Img: base64Data,
114
- isFront: index === 1
98
+ isFront: labels ? labels[index] === true : index === 1
115
99
  });
116
100
  converted++;
117
101
  if (converted === imagePaths.length) {
118
- convertedImages = images;
119
- dispatchWhenReady();
102
+ dispatchToWeb(images);
120
103
  }
121
104
  });
122
105
  });
@@ -129,16 +112,10 @@ const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError)
129
112
  if (event.status === 'inprogress' && event.msg === 'img_stitched_pdf_path') {
130
113
  const paths = event.img_original_paths || [];
131
114
  if (paths.length > 0) {
132
- convertImages(paths);
115
+ convertImages(paths, labelsFromEventImages(paths, event.images));
133
116
  }
134
117
  }
135
118
  }));
136
- subscriptions.push(
137
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
- emitter.addListener(VeryfiLens.Events.onVeryfiLensSuccess, event => {
139
- verdictPages = event?.data?.meta?.pages ?? null;
140
- dispatchWhenReady();
141
- }));
142
119
 
143
120
  // User cancelled (X button) without submitting: the web side never resets its
144
121
  // loading state on its own, so deliver an empty response to move it off the
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_veryfiService","VeryfiLens","default","isVeryfiAvailable","exports","CHECK_SETTINGS","documentTypes","checksBackIsOn","checksBackIsRequired","blurDetectionIsOn","autoDocDetectionAndCropIsOn","allowSubmitUndetectedDocsIsOn","dataExtractionEngine","returnStitchedPDF","originalImageMaxSizeInMB","BACK_CAPTURE_MODAL_KEY","buildEndorsement","bankName","bank","trim","VERDICT_WAIT_MS","configureAndShowVeryfiCamera","credentials","onImages","onError","emitter","NativeEventEmitter","NativeModule","subscriptions","capturing","dispatched","convertedImages","verdictPages","fallbackTimer","cleanup","forEach","sub","remove","clearTimeout","dispatchToWeb","images","dispatchWhenReady","labeled","labelSidesFromPages","setTimeout","convertImages","imagePaths","converted","filePath","index","getFileBase64","length","base64Data","push","base64Img","isFront","addListener","Events","onVeryfiLensUpdate","event","status","msg","paths","img_original_paths","onVeryfiLensSuccess","data","meta","pages","onVeryfiLensClose","onVeryfiLensError","veryfiCredentials","clientId","userName","apiKey","url","endorsement","settings","customLensStrings","en","configureWithCredentials","showCamera"],"sourceRoot":"../../../src","sources":["services/veryfiService.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","VeryfiLens","default","isVeryfiAvailable","exports","CHECK_SETTINGS","documentTypes","checksBackIsOn","checksBackIsRequired","blurDetectionIsOn","autoDocDetectionAndCropIsOn","allowSubmitUndetectedDocsIsOn","dataExtractionEngine","returnStitchedPDF","originalImageMaxSizeInMB","BACK_CAPTURE_MODAL_KEY","buildEndorsement","bankName","bank","trim","labelsFromEventImages","imagePaths","eventImages","Array","isArray","labels","filePath","match","find","image","path","is_front","push","configureAndShowVeryfiCamera","credentials","onImages","onError","emitter","NativeEventEmitter","NativeModule","subscriptions","capturing","dispatched","cleanup","forEach","sub","remove","dispatchToWeb","images","convertImages","converted","index","getFileBase64","length","base64Data","base64Img","isFront","addListener","Events","onVeryfiLensUpdate","event","status","msg","paths","img_original_paths","onVeryfiLensClose","setTimeout","onVeryfiLensError","veryfiCredentials","clientId","userName","apiKey","url","endorsement","settings","customLensStrings","en","configureWithCredentials","showCamera"],"sourceRoot":"../../../src","sources":["services/veryfiService.ts"],"mappings":"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","ignoreList":[]}
@@ -21,7 +21,7 @@ var _UNFontFileHelper = require("../nativeModulesHelpers/UNFontFileHelper/UNFont
21
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
22
  class UnitComponentsSDK {
23
23
  static securitySettings = _UnitComponentsSdk2.UNComponentsSDKConstants.securitySettings;
24
- static sdkVersion = '3.5.3';
24
+ static sdkVersion = '3.5.4';
25
25
  static iosFontBase64Map = {};
26
26
  static init = async (env, theme, language, fonts, webVersioningStrategy = _UnitComponentsSdk2.UNComponentsSDKConstants.webSDKRecommendedStrategy, securitySettings = _UnitComponentsSdk2.UNComponentsSDKConstants.securitySettings) => {
27
27
  try {
@@ -1,5 +1,4 @@
1
1
  import { NativeEventEmitter } from 'react-native';
2
- import { labelSidesFromPages } from './veryfiService.utils';
3
2
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
3
  let VeryfiLens = null;
5
4
  try {
@@ -33,9 +32,20 @@ const buildEndorsement = bankName => {
33
32
  return `Please make sure to sign the back and write “For mobile deposit ${bank ? `at ${bank}` : 'only'}”`;
34
33
  };
35
34
 
36
- // How long to hold delivery waiting for Veryfi's parsed result before falling
37
- // back to positional labeling.
38
- const VERDICT_WAIT_MS = 10000;
35
+ // Veryfi reports each capture's side in the update event's `images`, whose
36
+ // order does not track `img_original_paths` — sides are matched by file path.
37
+ // Returns null unless every path resolves, so a partial match falls back to
38
+ // positional labeling rather than producing two fronts.
39
+ const labelsFromEventImages = (imagePaths, eventImages) => {
40
+ if (!Array.isArray(eventImages)) return null;
41
+ const labels = [];
42
+ for (const filePath of imagePaths) {
43
+ const match = eventImages.find(image => image?.path === filePath);
44
+ if (typeof match?.is_front !== 'boolean') return null;
45
+ labels.push(match.is_front);
46
+ }
47
+ return labels;
48
+ };
39
49
  export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, onError) => {
40
50
  if (!VeryfiLens) {
41
51
  onError('Veryfi SDK is not available');
@@ -46,16 +56,8 @@ export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, on
46
56
  const subscriptions = [];
47
57
  let capturing = false;
48
58
  let dispatched = false;
49
- let convertedImages = null;
50
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
- let verdictPages = null;
52
- let fallbackTimer = null;
53
59
  const cleanup = () => {
54
60
  subscriptions.forEach(sub => sub.remove());
55
- if (fallbackTimer != null) {
56
- clearTimeout(fallbackTimer);
57
- fallbackTimer = null;
58
- }
59
61
  };
60
62
  const dispatchToWeb = images => {
61
63
  if (dispatched) return;
@@ -63,24 +65,7 @@ export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, on
63
65
  cleanup();
64
66
  onImages(images);
65
67
  };
66
-
67
- // Delivery is held briefly so Veryfi's parsed result — the authoritative
68
- // source for which image is the front — can label the pair before the web
69
- // renders it. The positional fallback covers slow or failed uploads;
70
- // position is unreliable across Veryfi versions (the order reversed in
71
- // Android lens 2.4.0.0), which is exactly why the verdict is preferred.
72
- const dispatchWhenReady = () => {
73
- if (dispatched || !convertedImages) return;
74
- if (verdictPages) {
75
- const labeled = labelSidesFromPages(convertedImages, verdictPages);
76
- dispatchToWeb(labeled ?? convertedImages);
77
- return;
78
- }
79
- if (fallbackTimer == null) {
80
- fallbackTimer = setTimeout(() => dispatchToWeb(convertedImages), VERDICT_WAIT_MS);
81
- }
82
- };
83
- const convertImages = imagePaths => {
68
+ const convertImages = (imagePaths, labels) => {
84
69
  if (capturing) return;
85
70
  capturing = true;
86
71
  let converted = 0;
@@ -92,8 +77,7 @@ export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, on
92
77
  converted++;
93
78
  if (converted === imagePaths.length) {
94
79
  if (images.length > 0) {
95
- convertedImages = images;
96
- dispatchWhenReady();
80
+ dispatchToWeb(images);
97
81
  } else {
98
82
  cleanup();
99
83
  onError('Failed to convert check images');
@@ -104,12 +88,11 @@ export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, on
104
88
  base64Data => {
105
89
  images.push({
106
90
  base64Img: base64Data,
107
- isFront: index === 1
91
+ isFront: labels ? labels[index] === true : index === 1
108
92
  });
109
93
  converted++;
110
94
  if (converted === imagePaths.length) {
111
- convertedImages = images;
112
- dispatchWhenReady();
95
+ dispatchToWeb(images);
113
96
  }
114
97
  });
115
98
  });
@@ -122,16 +105,10 @@ export const configureAndShowVeryfiCamera = (credentials, bankName, onImages, on
122
105
  if (event.status === 'inprogress' && event.msg === 'img_stitched_pdf_path') {
123
106
  const paths = event.img_original_paths || [];
124
107
  if (paths.length > 0) {
125
- convertImages(paths);
108
+ convertImages(paths, labelsFromEventImages(paths, event.images));
126
109
  }
127
110
  }
128
111
  }));
129
- subscriptions.push(
130
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
- emitter.addListener(VeryfiLens.Events.onVeryfiLensSuccess, event => {
132
- verdictPages = event?.data?.meta?.pages ?? null;
133
- dispatchWhenReady();
134
- }));
135
112
 
136
113
  // User cancelled (X button) without submitting: the web side never resets its
137
114
  // loading state on its own, so deliver an empty response to move it off the
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","labelSidesFromPages","VeryfiLens","require","default","isVeryfiAvailable","CHECK_SETTINGS","documentTypes","checksBackIsOn","checksBackIsRequired","blurDetectionIsOn","autoDocDetectionAndCropIsOn","allowSubmitUndetectedDocsIsOn","dataExtractionEngine","returnStitchedPDF","originalImageMaxSizeInMB","BACK_CAPTURE_MODAL_KEY","buildEndorsement","bankName","bank","trim","VERDICT_WAIT_MS","configureAndShowVeryfiCamera","credentials","onImages","onError","emitter","NativeModule","subscriptions","capturing","dispatched","convertedImages","verdictPages","fallbackTimer","cleanup","forEach","sub","remove","clearTimeout","dispatchToWeb","images","dispatchWhenReady","labeled","setTimeout","convertImages","imagePaths","converted","filePath","index","getFileBase64","length","base64Data","push","base64Img","isFront","addListener","Events","onVeryfiLensUpdate","event","status","msg","paths","img_original_paths","onVeryfiLensSuccess","data","meta","pages","onVeryfiLensClose","onVeryfiLensError","veryfiCredentials","clientId","userName","apiKey","url","endorsement","settings","customLensStrings","en","configureWithCredentials","showCamera"],"sourceRoot":"../../../src","sources":["services/veryfiService.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeEventEmitter","VeryfiLens","require","default","isVeryfiAvailable","CHECK_SETTINGS","documentTypes","checksBackIsOn","checksBackIsRequired","blurDetectionIsOn","autoDocDetectionAndCropIsOn","allowSubmitUndetectedDocsIsOn","dataExtractionEngine","returnStitchedPDF","originalImageMaxSizeInMB","BACK_CAPTURE_MODAL_KEY","buildEndorsement","bankName","bank","trim","labelsFromEventImages","imagePaths","eventImages","Array","isArray","labels","filePath","match","find","image","path","is_front","push","configureAndShowVeryfiCamera","credentials","onImages","onError","emitter","NativeModule","subscriptions","capturing","dispatched","cleanup","forEach","sub","remove","dispatchToWeb","images","convertImages","converted","index","getFileBase64","length","base64Data","base64Img","isFront","addListener","Events","onVeryfiLensUpdate","event","status","msg","paths","img_original_paths","onVeryfiLensClose","setTimeout","onVeryfiLensError","veryfiCredentials","clientId","userName","apiKey","url","endorsement","settings","customLensStrings","en","configureWithCredentials","showCamera"],"sourceRoot":"../../../src","sources":["services/veryfiService.ts"],"mappings":"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","ignoreList":[]}
@@ -14,7 +14,7 @@ import UNSnapshotProtectionHelper from '../nativeModulesHelpers/UNSanpshotProtec
14
14
  import { loadIosFontBase64 } from '../nativeModulesHelpers/UNFontFileHelper/UNFontFileHelper';
15
15
  export class UnitComponentsSDK {
16
16
  static securitySettings = UNComponentsSDKConstants.securitySettings;
17
- static sdkVersion = '3.5.3';
17
+ static sdkVersion = '3.5.4';
18
18
  static iosFontBase64Map = {};
19
19
  static init = async (env, theme, language, fonts, webVersioningStrategy = UNComponentsSDKConstants.webSDKRecommendedStrategy, securitySettings = UNComponentsSDKConstants.securitySettings) => {
20
20
  try {
@@ -1,6 +1,8 @@
1
1
  import type { UNVeryfiCredentials } from '../types/shared/veryfi.types';
2
- import type { UNVeryfiImage } from './veryfiService.utils';
3
- export type { UNVeryfiImage } from './veryfiService.utils';
2
+ export interface UNVeryfiImage {
3
+ base64Img: string;
4
+ isFront: boolean;
5
+ }
4
6
  export declare const isVeryfiAvailable: () => boolean;
5
7
  export declare const configureAndShowVeryfiCamera: (credentials: UNVeryfiCredentials, bankName: string | undefined, onImages: (images: UNVeryfiImage[]) => void, onError: (error: string) => void) => void;
6
8
  //# sourceMappingURL=veryfiService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"veryfiService.d.ts","sourceRoot":"","sources":["../../../../src/services/veryfiService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAW3D,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AA6BF,eAAO,MAAM,4BAA4B,gBAC1B,mBAAmB,YACtB,MAAM,GAAG,SAAS,qBACT,aAAa,EAAE,KAAK,IAAI,mBAC1B,MAAM,KAAK,IAAI,KAC/B,IAsJF,CAAC"}
1
+ {"version":3,"file":"veryfiService.d.ts","sourceRoot":"","sources":["../../../../src/services/veryfiService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AAyCF,eAAO,MAAM,4BAA4B,gBAC1B,mBAAmB,YACtB,MAAM,GAAG,SAAS,qBACT,aAAa,EAAE,KAAK,IAAI,mBAC1B,MAAM,KAAK,IAAI,KAC/B,IAmHF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-unit-components",
3
- "version": "3.5.3",
3
+ "version": "3.5.4",
4
4
  "description": "Unit React Native components",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -78,7 +78,7 @@
78
78
  "@types/react": "^16.14.20"
79
79
  },
80
80
  "peerDependencies": {
81
- "@veryfi/react-native-veryfi-lens": "*",
81
+ "@veryfi/react-native-veryfi-lens": ">=2.0.60",
82
82
  "react": "*",
83
83
  "react-native": "*",
84
84
  "react-native-plaid-link-sdk": "*",
@@ -1,9 +1,10 @@
1
1
  import { NativeEventEmitter } from 'react-native';
2
2
  import type { UNVeryfiCredentials } from '../types/shared/veryfi.types';
3
- import { labelSidesFromPages } from './veryfiService.utils';
4
- import type { UNVeryfiImage } from './veryfiService.utils';
5
3
 
6
- export type { UNVeryfiImage } from './veryfiService.utils';
4
+ export interface UNVeryfiImage {
5
+ base64Img: string;
6
+ isFront: boolean;
7
+ }
7
8
 
8
9
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
10
  let VeryfiLens: any = null;
@@ -41,9 +42,21 @@ const buildEndorsement = (bankName?: string): string => {
41
42
  return `Please make sure to sign the back and write “For mobile deposit ${bank ? `at ${bank}` : 'only'}”`;
42
43
  };
43
44
 
44
- // How long to hold delivery waiting for Veryfi's parsed result before falling
45
- // back to positional labeling.
46
- const VERDICT_WAIT_MS = 10000;
45
+ // Veryfi reports each capture's side in the update event's `images`, whose
46
+ // order does not track `img_original_paths` — sides are matched by file path.
47
+ // Returns null unless every path resolves, so a partial match falls back to
48
+ // positional labeling rather than producing two fronts.
49
+ const labelsFromEventImages = (imagePaths: string[], eventImages: unknown): boolean[] | null => {
50
+ if (!Array.isArray(eventImages)) return null;
51
+
52
+ const labels: boolean[] = [];
53
+ for (const filePath of imagePaths) {
54
+ const match = eventImages.find((image) => image?.path === filePath);
55
+ if (typeof match?.is_front !== 'boolean') return null;
56
+ labels.push(match.is_front);
57
+ }
58
+ return labels;
59
+ };
47
60
 
48
61
  export const configureAndShowVeryfiCamera = (
49
62
  credentials: UNVeryfiCredentials,
@@ -61,17 +74,9 @@ export const configureAndShowVeryfiCamera = (
61
74
  const subscriptions: any[] = [];
62
75
  let capturing = false;
63
76
  let dispatched = false;
64
- let convertedImages: UNVeryfiImage[] | null = null;
65
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
- let verdictPages: any = null;
67
- let fallbackTimer: ReturnType<typeof setTimeout> | null = null;
68
77
 
69
78
  const cleanup = () => {
70
79
  subscriptions.forEach((sub) => sub.remove());
71
- if (fallbackTimer != null) {
72
- clearTimeout(fallbackTimer);
73
- fallbackTimer = null;
74
- }
75
80
  };
76
81
 
77
82
  const dispatchToWeb = (images: UNVeryfiImage[]) => {
@@ -81,24 +86,7 @@ export const configureAndShowVeryfiCamera = (
81
86
  onImages(images);
82
87
  };
83
88
 
84
- // Delivery is held briefly so Veryfi's parsed result — the authoritative
85
- // source for which image is the front — can label the pair before the web
86
- // renders it. The positional fallback covers slow or failed uploads;
87
- // position is unreliable across Veryfi versions (the order reversed in
88
- // Android lens 2.4.0.0), which is exactly why the verdict is preferred.
89
- const dispatchWhenReady = () => {
90
- if (dispatched || !convertedImages) return;
91
- if (verdictPages) {
92
- const labeled = labelSidesFromPages(convertedImages, verdictPages);
93
- dispatchToWeb(labeled ?? convertedImages);
94
- return;
95
- }
96
- if (fallbackTimer == null) {
97
- fallbackTimer = setTimeout(() => dispatchToWeb(convertedImages as UNVeryfiImage[]), VERDICT_WAIT_MS);
98
- }
99
- };
100
-
101
- const convertImages = (imagePaths: string[]) => {
89
+ const convertImages = (imagePaths: string[], labels: boolean[] | null) => {
102
90
  if (capturing) return;
103
91
  capturing = true;
104
92
 
@@ -113,8 +101,7 @@ export const configureAndShowVeryfiCamera = (
113
101
  converted++;
114
102
  if (converted === imagePaths.length) {
115
103
  if (images.length > 0) {
116
- convertedImages = images;
117
- dispatchWhenReady();
104
+ dispatchToWeb(images);
118
105
  } else {
119
106
  cleanup();
120
107
  onError('Failed to convert check images');
@@ -125,12 +112,11 @@ export const configureAndShowVeryfiCamera = (
125
112
  (base64Data: string) => {
126
113
  images.push({
127
114
  base64Img: base64Data,
128
- isFront: index === 1,
115
+ isFront: labels ? labels[index] === true : index === 1,
129
116
  });
130
117
  converted++;
131
118
  if (converted === imagePaths.length) {
132
- convertedImages = images;
133
- dispatchWhenReady();
119
+ dispatchToWeb(images);
134
120
  }
135
121
  }
136
122
  );
@@ -144,20 +130,12 @@ export const configureAndShowVeryfiCamera = (
144
130
  if (event.status === 'inprogress' && event.msg === 'img_stitched_pdf_path') {
145
131
  const paths = event.img_original_paths || [];
146
132
  if (paths.length > 0) {
147
- convertImages(paths);
133
+ convertImages(paths, labelsFromEventImages(paths, event.images));
148
134
  }
149
135
  }
150
136
  })
151
137
  );
152
138
 
153
- subscriptions.push(
154
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
155
- emitter.addListener(VeryfiLens.Events.onVeryfiLensSuccess, (event: any) => {
156
- verdictPages = event?.data?.meta?.pages ?? null;
157
- dispatchWhenReady();
158
- })
159
- );
160
-
161
139
  // User cancelled (X button) without submitting: the web side never resets its
162
140
  // loading state on its own, so deliver an empty response to move it off the
163
141
  // stuck Continue. Grace period covers a close event racing the stitched event.
@@ -27,7 +27,7 @@ export class UnitComponentsSDK {
27
27
  protected static fonts?: UNFonts;
28
28
  protected static signedNonce?: string;
29
29
  protected static pushProvisionModule?: typeof NativeModules;
30
- protected static sdkVersion = '3.5.3';
30
+ protected static sdkVersion = '3.5.4';
31
31
  static iosFontBase64Map: Record<string, string> = {};
32
32
 
33
33
  public static init = async (
@@ -1,87 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.readJpegDimensions = exports.labelSidesFromPages = void 0;
7
- const JPEG_SOF_MARKERS = [0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf];
8
- const readJpegDimensions = base64 => {
9
- try {
10
- // SOF sits near the file start; a 4-aligned prefix keeps atob happy and cheap.
11
- const prefix = base64.length > 786432 ? base64.slice(0, 786432) : base64;
12
- const bytes = atob(prefix);
13
- if (bytes.charCodeAt(0) !== 0xff || bytes.charCodeAt(1) !== 0xd8) return null;
14
- let i = 2;
15
- while (i + 9 < bytes.length) {
16
- if (bytes.charCodeAt(i) !== 0xff) {
17
- i++;
18
- continue;
19
- }
20
- const marker = bytes.charCodeAt(i + 1);
21
- if (marker === 0xff) {
22
- i++;
23
- continue;
24
- }
25
- if (marker === 0x01 || marker >= 0xd0 && marker <= 0xd9) {
26
- i += 2;
27
- continue;
28
- }
29
- if (JPEG_SOF_MARKERS.includes(marker)) {
30
- return {
31
- height: bytes.charCodeAt(i + 5) * 256 + bytes.charCodeAt(i + 6),
32
- width: bytes.charCodeAt(i + 7) * 256 + bytes.charCodeAt(i + 8)
33
- };
34
- }
35
- i += 2 + bytes.charCodeAt(i + 2) * 256 + bytes.charCodeAt(i + 3);
36
- }
37
- return null;
38
- } catch {
39
- return null;
40
- }
41
- };
42
-
43
- // Veryfi's parsed result is the authority on which image is the front
44
- // (their meta.pages[].is_front); page order does not correspond to the
45
- // delivery array's order, so pages are matched to our images by exact
46
- // pixel dimensions. Returns null whenever the verdict is not unambiguous.
47
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
- exports.readJpegDimensions = readJpegDimensions;
49
- const labelSidesFromPages = (images, pages) => {
50
- if (!Array.isArray(pages) || pages.length !== 2 || images.length !== 2) return null;
51
- const fronts = pages.filter(p => p && p.is_front === true);
52
- const backs = pages.filter(p => p && p.is_front === false);
53
- const frontPage = fronts[0];
54
- const backPage = backs[0];
55
- if (fronts.length !== 1 || backs.length !== 1 || !frontPage || !backPage) return null;
56
- if (typeof frontPage.width !== 'number' || typeof frontPage.height !== 'number') return null;
57
- const dims = [];
58
- for (const img of images) {
59
- const d = readJpegDimensions(img.base64Img);
60
- if (!d) return null;
61
- dims.push(d);
62
- }
63
-
64
- // Veryfi may auto-rotate pages in the parsed result, so dimensions are
65
- // compared as an unordered pair.
66
- const sameDims = (d, w, h) => d.width === w && d.height === h || d.width === h && d.height === w;
67
- const matchesFront = dims.map(d => sameDims(d, frontPage.width, frontPage.height));
68
- if (matchesFront.filter(Boolean).length !== 1) return null;
69
- const frontIdx = matchesFront.indexOf(true);
70
- const backIdx = 1 - frontIdx;
71
- const frontImage = images[frontIdx];
72
- const backImage = images[backIdx];
73
- const backDims = dims[backIdx];
74
- if (!frontImage || !backImage || !backDims) return null;
75
- if (typeof backPage.width === 'number' && typeof backPage.height === 'number') {
76
- if (!sameDims(backDims, backPage.width, backPage.height)) return null;
77
- }
78
- return [{
79
- base64Img: frontImage.base64Img,
80
- isFront: true
81
- }, {
82
- base64Img: backImage.base64Img,
83
- isFront: false
84
- }];
85
- };
86
- exports.labelSidesFromPages = labelSidesFromPages;
87
- //# sourceMappingURL=veryfiService.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["JPEG_SOF_MARKERS","readJpegDimensions","base64","prefix","length","slice","bytes","atob","charCodeAt","i","marker","includes","height","width","exports","labelSidesFromPages","images","pages","Array","isArray","fronts","filter","p","is_front","backs","frontPage","backPage","dims","img","d","base64Img","push","sameDims","w","h","matchesFront","map","Boolean","frontIdx","indexOf","backIdx","frontImage","backImage","backDims","isFront"],"sourceRoot":"../../../src","sources":["services/veryfiService.utils.ts"],"mappings":"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","ignoreList":[]}
@@ -1,79 +0,0 @@
1
- const JPEG_SOF_MARKERS = [0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf];
2
- export const readJpegDimensions = base64 => {
3
- try {
4
- // SOF sits near the file start; a 4-aligned prefix keeps atob happy and cheap.
5
- const prefix = base64.length > 786432 ? base64.slice(0, 786432) : base64;
6
- const bytes = atob(prefix);
7
- if (bytes.charCodeAt(0) !== 0xff || bytes.charCodeAt(1) !== 0xd8) return null;
8
- let i = 2;
9
- while (i + 9 < bytes.length) {
10
- if (bytes.charCodeAt(i) !== 0xff) {
11
- i++;
12
- continue;
13
- }
14
- const marker = bytes.charCodeAt(i + 1);
15
- if (marker === 0xff) {
16
- i++;
17
- continue;
18
- }
19
- if (marker === 0x01 || marker >= 0xd0 && marker <= 0xd9) {
20
- i += 2;
21
- continue;
22
- }
23
- if (JPEG_SOF_MARKERS.includes(marker)) {
24
- return {
25
- height: bytes.charCodeAt(i + 5) * 256 + bytes.charCodeAt(i + 6),
26
- width: bytes.charCodeAt(i + 7) * 256 + bytes.charCodeAt(i + 8)
27
- };
28
- }
29
- i += 2 + bytes.charCodeAt(i + 2) * 256 + bytes.charCodeAt(i + 3);
30
- }
31
- return null;
32
- } catch {
33
- return null;
34
- }
35
- };
36
-
37
- // Veryfi's parsed result is the authority on which image is the front
38
- // (their meta.pages[].is_front); page order does not correspond to the
39
- // delivery array's order, so pages are matched to our images by exact
40
- // pixel dimensions. Returns null whenever the verdict is not unambiguous.
41
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
- export const labelSidesFromPages = (images, pages) => {
43
- if (!Array.isArray(pages) || pages.length !== 2 || images.length !== 2) return null;
44
- const fronts = pages.filter(p => p && p.is_front === true);
45
- const backs = pages.filter(p => p && p.is_front === false);
46
- const frontPage = fronts[0];
47
- const backPage = backs[0];
48
- if (fronts.length !== 1 || backs.length !== 1 || !frontPage || !backPage) return null;
49
- if (typeof frontPage.width !== 'number' || typeof frontPage.height !== 'number') return null;
50
- const dims = [];
51
- for (const img of images) {
52
- const d = readJpegDimensions(img.base64Img);
53
- if (!d) return null;
54
- dims.push(d);
55
- }
56
-
57
- // Veryfi may auto-rotate pages in the parsed result, so dimensions are
58
- // compared as an unordered pair.
59
- const sameDims = (d, w, h) => d.width === w && d.height === h || d.width === h && d.height === w;
60
- const matchesFront = dims.map(d => sameDims(d, frontPage.width, frontPage.height));
61
- if (matchesFront.filter(Boolean).length !== 1) return null;
62
- const frontIdx = matchesFront.indexOf(true);
63
- const backIdx = 1 - frontIdx;
64
- const frontImage = images[frontIdx];
65
- const backImage = images[backIdx];
66
- const backDims = dims[backIdx];
67
- if (!frontImage || !backImage || !backDims) return null;
68
- if (typeof backPage.width === 'number' && typeof backPage.height === 'number') {
69
- if (!sameDims(backDims, backPage.width, backPage.height)) return null;
70
- }
71
- return [{
72
- base64Img: frontImage.base64Img,
73
- isFront: true
74
- }, {
75
- base64Img: backImage.base64Img,
76
- isFront: false
77
- }];
78
- };
79
- //# sourceMappingURL=veryfiService.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["JPEG_SOF_MARKERS","readJpegDimensions","base64","prefix","length","slice","bytes","atob","charCodeAt","i","marker","includes","height","width","labelSidesFromPages","images","pages","Array","isArray","fronts","filter","p","is_front","backs","frontPage","backPage","dims","img","d","base64Img","push","sameDims","w","h","matchesFront","map","Boolean","frontIdx","indexOf","backIdx","frontImage","backImage","backDims","isFront"],"sourceRoot":"../../../src","sources":["services/veryfiService.utils.ts"],"mappings":"AAKA,MAAMA,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAEvG,OAAO,MAAMC,kBAAkB,GAAIC,MAAc,IAA+C;EAC9F,IAAI;IACF;IACA,MAAMC,MAAM,GAAGD,MAAM,CAACE,MAAM,GAAG,MAAM,GAAGF,MAAM,CAACG,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAGH,MAAM;IACxE,MAAMI,KAAK,GAAGC,IAAI,CAACJ,MAAM,CAAC;IAC1B,IAAIG,KAAK,CAACE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,IAAIF,KAAK,CAACE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,IAAI;IAC7E,IAAIC,CAAC,GAAG,CAAC;IACT,OAAOA,CAAC,GAAG,CAAC,GAAGH,KAAK,CAACF,MAAM,EAAE;MAC3B,IAAIE,KAAK,CAACE,UAAU,CAACC,CAAC,CAAC,KAAK,IAAI,EAAE;QAChCA,CAAC,EAAE;QACH;MACF;MACA,MAAMC,MAAM,GAAGJ,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC;MACtC,IAAIC,MAAM,KAAK,IAAI,EAAE;QACnBD,CAAC,EAAE;QACH;MACF;MACA,IAAIC,MAAM,KAAK,IAAI,IAAKA,MAAM,IAAI,IAAI,IAAIA,MAAM,IAAI,IAAK,EAAE;QACzDD,CAAC,IAAI,CAAC;QACN;MACF;MACA,IAAIT,gBAAgB,CAACW,QAAQ,CAACD,MAAM,CAAC,EAAE;QACrC,OAAO;UACLE,MAAM,EAAEN,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAGH,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC;UAC/DI,KAAK,EAAEP,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAGH,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC;QAC/D,CAAC;MACH;MACAA,CAAC,IAAI,CAAC,GAAGH,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAGH,KAAK,CAACE,UAAU,CAACC,CAAC,GAAG,CAAC,CAAC;IAClE;IACA,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMK,mBAAmB,GAAGA,CAACC,MAAuB,EAAEC,KAAU,KAA6B;EAClG,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACZ,MAAM,KAAK,CAAC,IAAIW,MAAM,CAACX,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EAEnF,MAAMe,MAAM,GAAGH,KAAK,CAACI,MAAM,CAAEC,CAAC,IAAKA,CAAC,IAAIA,CAAC,CAACC,QAAQ,KAAK,IAAI,CAAC;EAC5D,MAAMC,KAAK,GAAGP,KAAK,CAACI,MAAM,CAAEC,CAAC,IAAKA,CAAC,IAAIA,CAAC,CAACC,QAAQ,KAAK,KAAK,CAAC;EAC5D,MAAME,SAAS,GAAGL,MAAM,CAAC,CAAC,CAAC;EAC3B,MAAMM,QAAQ,GAAGF,KAAK,CAAC,CAAC,CAAC;EACzB,IAAIJ,MAAM,CAACf,MAAM,KAAK,CAAC,IAAImB,KAAK,CAACnB,MAAM,KAAK,CAAC,IAAI,CAACoB,SAAS,IAAI,CAACC,QAAQ,EAAE,OAAO,IAAI;EACrF,IAAI,OAAOD,SAAS,CAACX,KAAK,KAAK,QAAQ,IAAI,OAAOW,SAAS,CAACZ,MAAM,KAAK,QAAQ,EAAE,OAAO,IAAI;EAE5F,MAAMc,IAAyC,GAAG,EAAE;EACpD,KAAK,MAAMC,GAAG,IAAIZ,MAAM,EAAE;IACxB,MAAMa,CAAC,GAAG3B,kBAAkB,CAAC0B,GAAG,CAACE,SAAS,CAAC;IAC3C,IAAI,CAACD,CAAC,EAAE,OAAO,IAAI;IACnBF,IAAI,CAACI,IAAI,CAACF,CAAC,CAAC;EACd;;EAEA;EACA;EACA,MAAMG,QAAQ,GAAGA,CAACH,CAAoC,EAAEI,CAAS,EAAEC,CAAS,KACzEL,CAAC,CAACf,KAAK,KAAKmB,CAAC,IAAIJ,CAAC,CAAChB,MAAM,KAAKqB,CAAC,IAAML,CAAC,CAACf,KAAK,KAAKoB,CAAC,IAAIL,CAAC,CAAChB,MAAM,KAAKoB,CAAE;EAExE,MAAME,YAAY,GAAGR,IAAI,CAACS,GAAG,CAAEP,CAAC,IAAKG,QAAQ,CAACH,CAAC,EAAEJ,SAAS,CAACX,KAAK,EAAEW,SAAS,CAACZ,MAAM,CAAC,CAAC;EACpF,IAAIsB,YAAY,CAACd,MAAM,CAACgB,OAAO,CAAC,CAAChC,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EAE1D,MAAMiC,QAAQ,GAAGH,YAAY,CAACI,OAAO,CAAC,IAAI,CAAC;EAC3C,MAAMC,OAAO,GAAG,CAAC,GAAGF,QAAQ;EAC5B,MAAMG,UAAU,GAAGzB,MAAM,CAACsB,QAAQ,CAAC;EACnC,MAAMI,SAAS,GAAG1B,MAAM,CAACwB,OAAO,CAAC;EACjC,MAAMG,QAAQ,GAAGhB,IAAI,CAACa,OAAO,CAAC;EAC9B,IAAI,CAACC,UAAU,IAAI,CAACC,SAAS,IAAI,CAACC,QAAQ,EAAE,OAAO,IAAI;EACvD,IAAI,OAAOjB,QAAQ,CAACZ,KAAK,KAAK,QAAQ,IAAI,OAAOY,QAAQ,CAACb,MAAM,KAAK,QAAQ,EAAE;IAC7E,IAAI,CAACmB,QAAQ,CAACW,QAAQ,EAAEjB,QAAQ,CAACZ,KAAK,EAAEY,QAAQ,CAACb,MAAM,CAAC,EAAE,OAAO,IAAI;EACvE;EAEA,OAAO,CACL;IAAEiB,SAAS,EAAEW,UAAU,CAACX,SAAS;IAAEc,OAAO,EAAE;EAAK,CAAC,EAClD;IAAEd,SAAS,EAAEY,SAAS,CAACZ,SAAS;IAAEc,OAAO,EAAE;EAAM,CAAC,CACnD;AACH,CAAC","ignoreList":[]}
@@ -1,10 +0,0 @@
1
- export interface UNVeryfiImage {
2
- base64Img: string;
3
- isFront: boolean;
4
- }
5
- export declare const readJpegDimensions: (base64: string) => {
6
- width: number;
7
- height: number;
8
- } | null;
9
- export declare const labelSidesFromPages: (images: UNVeryfiImage[], pages: any) => UNVeryfiImage[] | null;
10
- //# sourceMappingURL=veryfiService.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"veryfiService.utils.d.ts","sourceRoot":"","sources":["../../../../src/services/veryfiService.utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,eAAO,MAAM,kBAAkB,WAAY,MAAM,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAiCvF,CAAC;AAOF,eAAO,MAAM,mBAAmB,WAAY,aAAa,EAAE,SAAS,GAAG,KAAG,aAAa,EAAE,GAAG,IAuC3F,CAAC"}
@@ -1,87 +0,0 @@
1
- export interface UNVeryfiImage {
2
- base64Img: string;
3
- isFront: boolean;
4
- }
5
-
6
- const JPEG_SOF_MARKERS = [0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf];
7
-
8
- export const readJpegDimensions = (base64: string): { width: number; height: number } | null => {
9
- try {
10
- // SOF sits near the file start; a 4-aligned prefix keeps atob happy and cheap.
11
- const prefix = base64.length > 786432 ? base64.slice(0, 786432) : base64;
12
- const bytes = atob(prefix);
13
- if (bytes.charCodeAt(0) !== 0xff || bytes.charCodeAt(1) !== 0xd8) return null;
14
- let i = 2;
15
- while (i + 9 < bytes.length) {
16
- if (bytes.charCodeAt(i) !== 0xff) {
17
- i++;
18
- continue;
19
- }
20
- const marker = bytes.charCodeAt(i + 1);
21
- if (marker === 0xff) {
22
- i++;
23
- continue;
24
- }
25
- if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd9)) {
26
- i += 2;
27
- continue;
28
- }
29
- if (JPEG_SOF_MARKERS.includes(marker)) {
30
- return {
31
- height: bytes.charCodeAt(i + 5) * 256 + bytes.charCodeAt(i + 6),
32
- width: bytes.charCodeAt(i + 7) * 256 + bytes.charCodeAt(i + 8),
33
- };
34
- }
35
- i += 2 + bytes.charCodeAt(i + 2) * 256 + bytes.charCodeAt(i + 3);
36
- }
37
- return null;
38
- } catch {
39
- return null;
40
- }
41
- };
42
-
43
- // Veryfi's parsed result is the authority on which image is the front
44
- // (their meta.pages[].is_front); page order does not correspond to the
45
- // delivery array's order, so pages are matched to our images by exact
46
- // pixel dimensions. Returns null whenever the verdict is not unambiguous.
47
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
- export const labelSidesFromPages = (images: UNVeryfiImage[], pages: any): UNVeryfiImage[] | null => {
49
- if (!Array.isArray(pages) || pages.length !== 2 || images.length !== 2) return null;
50
-
51
- const fronts = pages.filter((p) => p && p.is_front === true);
52
- const backs = pages.filter((p) => p && p.is_front === false);
53
- const frontPage = fronts[0];
54
- const backPage = backs[0];
55
- if (fronts.length !== 1 || backs.length !== 1 || !frontPage || !backPage) return null;
56
- if (typeof frontPage.width !== 'number' || typeof frontPage.height !== 'number') return null;
57
-
58
- const dims: { width: number; height: number }[] = [];
59
- for (const img of images) {
60
- const d = readJpegDimensions(img.base64Img);
61
- if (!d) return null;
62
- dims.push(d);
63
- }
64
-
65
- // Veryfi may auto-rotate pages in the parsed result, so dimensions are
66
- // compared as an unordered pair.
67
- const sameDims = (d: { width: number; height: number }, w: number, h: number) =>
68
- (d.width === w && d.height === h) || (d.width === h && d.height === w);
69
-
70
- const matchesFront = dims.map((d) => sameDims(d, frontPage.width, frontPage.height));
71
- if (matchesFront.filter(Boolean).length !== 1) return null;
72
-
73
- const frontIdx = matchesFront.indexOf(true);
74
- const backIdx = 1 - frontIdx;
75
- const frontImage = images[frontIdx];
76
- const backImage = images[backIdx];
77
- const backDims = dims[backIdx];
78
- if (!frontImage || !backImage || !backDims) return null;
79
- if (typeof backPage.width === 'number' && typeof backPage.height === 'number') {
80
- if (!sameDims(backDims, backPage.width, backPage.height)) return null;
81
- }
82
-
83
- return [
84
- { base64Img: frontImage.base64Img, isFront: true },
85
- { base64Img: backImage.base64Img, isFront: false },
86
- ];
87
- };