idmission-web-sdk 2.3.114 → 2.3.115
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/components/common/debug.d.ts +1 -1
- package/dist/components/common/debug.d.ts.map +1 -1
- package/dist/components/selfie_capture/SelfieGuidanceModelsProvider.d.ts.map +1 -1
- package/dist/components/video_id/IdVideoCaptureWizard.d.ts.map +1 -1
- package/dist/components/video_signature_capture/VideoSignatureCapture.d.ts.map +1 -1
- package/dist/components/video_signature_capture/VideoSignatureWizard.d.ts.map +1 -1
- package/dist/lib/camera/useVideoRecorder.d.ts.map +1 -1
- package/dist/lib/models/DocumentDetection.d.ts +2 -1
- package/dist/lib/models/DocumentDetection.d.ts.map +1 -1
- package/dist/lib/models/FaceDetection.d.ts +5 -4
- package/dist/lib/models/FaceDetection.d.ts.map +1 -1
- package/dist/lib/models/defaults/DocumentDetector.d.ts +2 -2
- package/dist/sdk2.cjs.development.js +126 -204
- package/dist/sdk2.cjs.development.js.map +1 -1
- package/dist/sdk2.cjs.production.js +1 -1
- package/dist/sdk2.cjs.production.js.map +1 -1
- package/dist/sdk2.esm.js +127 -205
- package/dist/sdk2.esm.js.map +1 -1
- package/dist/sdk2.umd.development.js +126 -204
- package/dist/sdk2.umd.development.js.map +1 -1
- package/dist/sdk2.umd.production.js +1 -1
- package/dist/sdk2.umd.production.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +3 -3
|
@@ -236,7 +236,7 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
236
236
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
237
237
|
};
|
|
238
238
|
|
|
239
|
-
var webSdkVersion = '2.3.
|
|
239
|
+
var webSdkVersion = '2.3.115';
|
|
240
240
|
|
|
241
241
|
function getPlatform() {
|
|
242
242
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
@@ -2379,8 +2379,8 @@ function giveUpAfter(maxTime) {
|
|
|
2379
2379
|
|
|
2380
2380
|
var DEFAULT_CDN_URL = 'https://websdk-cdn-dev.idmission.com/assets';
|
|
2381
2381
|
|
|
2382
|
-
var defaultDocumentDetectorModelPath = "".concat(DEFAULT_CDN_URL, "/models/DocumentDetector/DocumentDetector-
|
|
2383
|
-
var defaultDocumentDetectorModelHash = '
|
|
2382
|
+
var defaultDocumentDetectorModelPath = "".concat(DEFAULT_CDN_URL, "/models/DocumentDetector/DocumentDetector-20251018_121234.tflite");
|
|
2383
|
+
var defaultDocumentDetectorModelHash = 'cTLjb4g6H+a+RHnLaYrvVF8050qv/Ox04rMtxFXBDR6Xv8Pv+X//hsaO3K3jNPog';
|
|
2384
2384
|
|
|
2385
2385
|
var defaultFocusModelPath = "".concat(DEFAULT_CDN_URL, "/models/Focus/Focus-20241008_102708.tflite");
|
|
2386
2386
|
var defaultFocusModelHash = 'HTJNLB7QybtPXIIyUI9oNqW40vE5bgSV5V24R1wXLQHknNEVOSyDQDo/QzRgJ8jb';
|
|
@@ -2697,8 +2697,8 @@ var documentTypeDisplayNames = {
|
|
|
2697
2697
|
singlePage: 'Single page',
|
|
2698
2698
|
none: 'None'
|
|
2699
2699
|
};
|
|
2700
|
-
var detector
|
|
2701
|
-
var detectorSettings
|
|
2700
|
+
var detector = null;
|
|
2701
|
+
var detectorSettings = null;
|
|
2702
2702
|
function loadDocumentDetector() {
|
|
2703
2703
|
return __awaiter(this, arguments, void 0, function (modelAssetPath, scoreThreshold) {
|
|
2704
2704
|
var _a, _b;
|
|
@@ -2711,7 +2711,7 @@ function loadDocumentDetector() {
|
|
|
2711
2711
|
return __generator(this, function (_c) {
|
|
2712
2712
|
switch (_c.label) {
|
|
2713
2713
|
case 0:
|
|
2714
|
-
if (detector
|
|
2714
|
+
if (detector && (detectorSettings === null || detectorSettings === void 0 ? void 0 : detectorSettings.modelAssetPath) === modelAssetPath && (detectorSettings === null || detectorSettings === void 0 ? void 0 : detectorSettings.scoreThreshold) === scoreThreshold) return [2 /*return*/, detector];
|
|
2715
2715
|
closeDocumentDetector();
|
|
2716
2716
|
return [4 /*yield*/, preloadDocumentDetectorDependencies()];
|
|
2717
2717
|
case 1:
|
|
@@ -2732,20 +2732,20 @@ function loadDocumentDetector() {
|
|
|
2732
2732
|
runningMode: 'VIDEO'
|
|
2733
2733
|
}])];
|
|
2734
2734
|
case 3:
|
|
2735
|
-
detector
|
|
2736
|
-
detectorSettings
|
|
2735
|
+
detector = _c.sent();
|
|
2736
|
+
detectorSettings = {
|
|
2737
2737
|
modelAssetPath: modelAssetPath,
|
|
2738
2738
|
scoreThreshold: scoreThreshold
|
|
2739
2739
|
};
|
|
2740
|
-
return [2 /*return*/, detector
|
|
2740
|
+
return [2 /*return*/, detector];
|
|
2741
2741
|
}
|
|
2742
2742
|
});
|
|
2743
2743
|
});
|
|
2744
2744
|
}
|
|
2745
2745
|
function closeDocumentDetector() {
|
|
2746
|
-
detector
|
|
2747
|
-
detector
|
|
2748
|
-
detectorSettings
|
|
2746
|
+
detector === null || detector === void 0 ? void 0 : detector.close();
|
|
2747
|
+
detector = null;
|
|
2748
|
+
detectorSettings = null;
|
|
2749
2749
|
}
|
|
2750
2750
|
function useLoadDocumentDetector(_a) {
|
|
2751
2751
|
var _b = _a.shouldLoadModels,
|
|
@@ -2846,12 +2846,12 @@ function makeDocumentDetectorPrediction(frame) {
|
|
|
2846
2846
|
return __awaiter(this, void 0, void 0, function () {
|
|
2847
2847
|
var startedAt, prediction, time, frameWidth, frameHeight;
|
|
2848
2848
|
return __generator(this, function (_a) {
|
|
2849
|
-
if (!detector
|
|
2849
|
+
if (!detector) return [2 /*return*/, null];
|
|
2850
2850
|
startedAt = performance.now();
|
|
2851
2851
|
// Detectors can throw errors, for example when using custom URLs that
|
|
2852
2852
|
// contain a model that doesn't provide the expected output.
|
|
2853
2853
|
try {
|
|
2854
|
-
prediction = detector
|
|
2854
|
+
prediction = detector.detectForVideo(frame, performance.now());
|
|
2855
2855
|
time = performance.now() - startedAt;
|
|
2856
2856
|
frameWidth = frame.width;
|
|
2857
2857
|
frameHeight = frame.height;
|
|
@@ -6831,6 +6831,7 @@ function SelfieCaptureFaceKeypoint(_a) {
|
|
|
6831
6831
|
scaledHeight = _c.scaledHeight,
|
|
6832
6832
|
xOffset = _c.xOffset,
|
|
6833
6833
|
yOffset = _c.yOffset;
|
|
6834
|
+
if (!point) return /*#__PURE__*/React__namespace.default.createElement(React__namespace.default.Fragment, null);
|
|
6834
6835
|
var left, top;
|
|
6835
6836
|
if (horizontal) {
|
|
6836
6837
|
left = point.x / videoWidth * scaledWidth - xOffset;
|
|
@@ -11905,136 +11906,6 @@ var FaceCaptureGuideOverlay = function FaceCaptureGuideOverlay(_a) {
|
|
|
11905
11906
|
var templateObject_1$n, templateObject_2$l;
|
|
11906
11907
|
|
|
11907
11908
|
var defaultSelfieCaptureModelLoadTimeoutMs = 45000;
|
|
11908
|
-
var detector = null;
|
|
11909
|
-
var detectorSettings = null;
|
|
11910
|
-
function loadFaceDetector() {
|
|
11911
|
-
return __awaiter(this, arguments, void 0, function (modelAssetPath) {
|
|
11912
|
-
var _a, _b;
|
|
11913
|
-
if (modelAssetPath === void 0) {
|
|
11914
|
-
modelAssetPath = defaultFaceDetectorModelPath;
|
|
11915
|
-
}
|
|
11916
|
-
return __generator(this, function (_c) {
|
|
11917
|
-
switch (_c.label) {
|
|
11918
|
-
case 0:
|
|
11919
|
-
if (detector && (detectorSettings === null || detectorSettings === void 0 ? void 0 : detectorSettings.modelAssetPath) === modelAssetPath) return [2 /*return*/, detector];
|
|
11920
|
-
closeFaceDetector();
|
|
11921
|
-
return [4 /*yield*/, preloadFaceDetectorDependencies()];
|
|
11922
|
-
case 1:
|
|
11923
|
-
_c.sent();
|
|
11924
|
-
if (modelCapabilities.delegate === 'NONE') {
|
|
11925
|
-
throw new Error('No available delegate for face detector.');
|
|
11926
|
-
}
|
|
11927
|
-
_b = (_a = tasksVision.FaceDetector).createFromOptions;
|
|
11928
|
-
return [4 /*yield*/, tasksVision.FilesetResolver.forVisionTasks(visionTasksBasePath)];
|
|
11929
|
-
case 2:
|
|
11930
|
-
return [4 /*yield*/, _b.apply(_a, [_c.sent(), {
|
|
11931
|
-
// canvas: document.createElement('canvas'),
|
|
11932
|
-
baseOptions: {
|
|
11933
|
-
modelAssetPath: modelAssetPath,
|
|
11934
|
-
delegate: modelCapabilities.delegate
|
|
11935
|
-
},
|
|
11936
|
-
runningMode: 'VIDEO'
|
|
11937
|
-
}])];
|
|
11938
|
-
case 3:
|
|
11939
|
-
detector = _c.sent();
|
|
11940
|
-
detectorSettings = {
|
|
11941
|
-
modelAssetPath: modelAssetPath
|
|
11942
|
-
};
|
|
11943
|
-
return [2 /*return*/, detector];
|
|
11944
|
-
}
|
|
11945
|
-
});
|
|
11946
|
-
});
|
|
11947
|
-
}
|
|
11948
|
-
function closeFaceDetector() {
|
|
11949
|
-
detector === null || detector === void 0 ? void 0 : detector.close();
|
|
11950
|
-
detector = null;
|
|
11951
|
-
detectorSettings = null;
|
|
11952
|
-
}
|
|
11953
|
-
function useLoadFaceDetector(_a) {
|
|
11954
|
-
var onModelError = _a.onModelError,
|
|
11955
|
-
_b = _a.modelLoadTimeoutMs,
|
|
11956
|
-
modelLoadTimeoutMs = _b === void 0 ? defaultSelfieCaptureModelLoadTimeoutMs : _b,
|
|
11957
|
-
videoRef = _a.videoRef;
|
|
11958
|
-
var _c = React.useState('not-started'),
|
|
11959
|
-
modelLoadState = _c[0],
|
|
11960
|
-
setModelLoadState = _c[1];
|
|
11961
|
-
var _d = React.useState(0),
|
|
11962
|
-
modelDownloadProgress = _d[0],
|
|
11963
|
-
setModelDownloadProgress = _d[1];
|
|
11964
|
-
var _e = React.useState(null),
|
|
11965
|
-
modelWarmingStartedAt = _e[0],
|
|
11966
|
-
setModelWarmingStartedAt = _e[1];
|
|
11967
|
-
var _f = React.useState(null),
|
|
11968
|
-
modelError = _f[0],
|
|
11969
|
-
setModelError = _f[1];
|
|
11970
|
-
React.useEffect(function loadModel() {
|
|
11971
|
-
var _this = this;
|
|
11972
|
-
setModelLoadState('downloading');
|
|
11973
|
-
setModelWarmingStartedAt(null);
|
|
11974
|
-
var modelLoadTimeout = setTimeout(function () {
|
|
11975
|
-
setModelError(new Error('Model loading time limit exceeded.'));
|
|
11976
|
-
}, modelLoadTimeoutMs);
|
|
11977
|
-
function handleDownloadProgress(event) {
|
|
11978
|
-
setModelDownloadProgress(progressToPercentage(event.detail));
|
|
11979
|
-
}
|
|
11980
|
-
document.addEventListener('idmission.preloadProgress.faceDetection', handleDownloadProgress);
|
|
11981
|
-
var cancelVideoReady = function cancelVideoReady() {};
|
|
11982
|
-
loadFaceDetector().then(function (model) {
|
|
11983
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
11984
|
-
var _a, videoReady, cancel, cancelled;
|
|
11985
|
-
return __generator(this, function (_b) {
|
|
11986
|
-
switch (_b.label) {
|
|
11987
|
-
case 0:
|
|
11988
|
-
setModelDownloadProgress(100);
|
|
11989
|
-
clearTimeout(modelLoadTimeout);
|
|
11990
|
-
setModelLoadState('warming');
|
|
11991
|
-
setModelWarmingStartedAt(performance.now());
|
|
11992
|
-
return [4 /*yield*/, testFaceDetectionAgainstKnownImage(model)];
|
|
11993
|
-
case 1:
|
|
11994
|
-
_b.sent();
|
|
11995
|
-
_a = waitForVideoReady(videoRef), videoReady = _a[0], cancel = _a[1];
|
|
11996
|
-
cancelled = false;
|
|
11997
|
-
cancelVideoReady = function cancelVideoReady() {
|
|
11998
|
-
cancelled = true;
|
|
11999
|
-
cancel();
|
|
12000
|
-
};
|
|
12001
|
-
return [4 /*yield*/, videoReady];
|
|
12002
|
-
case 2:
|
|
12003
|
-
_b.sent();
|
|
12004
|
-
if (cancelled) return [2 /*return*/];
|
|
12005
|
-
model.detectForVideo(videoRef.current, performance.now());
|
|
12006
|
-
setModelLoadState('ready');
|
|
12007
|
-
return [2 /*return*/];
|
|
12008
|
-
}
|
|
12009
|
-
});
|
|
12010
|
-
});
|
|
12011
|
-
})["catch"](function (e) {
|
|
12012
|
-
setModelError(e);
|
|
12013
|
-
setModelLoadState('error');
|
|
12014
|
-
})["finally"](function () {
|
|
12015
|
-
clearTimeout(modelLoadTimeout);
|
|
12016
|
-
});
|
|
12017
|
-
return function () {
|
|
12018
|
-
log('unloading face detection model');
|
|
12019
|
-
cancelVideoReady();
|
|
12020
|
-
closeFaceDetector();
|
|
12021
|
-
clearTimeout(modelLoadTimeout);
|
|
12022
|
-
document.removeEventListener('idmission.preloadProgress.faceDetection', handleDownloadProgress);
|
|
12023
|
-
};
|
|
12024
|
-
}, [modelLoadTimeoutMs, videoRef]);
|
|
12025
|
-
React.useEffect(function handleModelError() {
|
|
12026
|
-
if (modelError) onModelError === null || onModelError === void 0 ? void 0 : onModelError(modelError);
|
|
12027
|
-
}, [modelError, onModelError]);
|
|
12028
|
-
return React.useMemo(function () {
|
|
12029
|
-
return {
|
|
12030
|
-
ready: modelLoadState === 'ready',
|
|
12031
|
-
modelLoadState: modelLoadState,
|
|
12032
|
-
modelDownloadProgress: modelDownloadProgress,
|
|
12033
|
-
modelWarmingStartedAt: modelWarmingStartedAt,
|
|
12034
|
-
modelError: modelError
|
|
12035
|
-
};
|
|
12036
|
-
}, [modelLoadState, modelDownloadProgress, modelWarmingStartedAt, modelError]);
|
|
12037
|
-
}
|
|
12038
11909
|
var lastFaceDetectionAt = 0;
|
|
12039
11910
|
var lastFaceDetectionTime = 0;
|
|
12040
11911
|
function setLastFaceDetectionAt(time) {
|
|
@@ -12084,24 +11955,68 @@ function trackFace(face, framesNeeded, frameWidth, frameHeight) {
|
|
|
12084
11955
|
if (lastNNosePairs.length > framesNeeded - 1) lastNNosePairs.length = framesNeeded - 1;
|
|
12085
11956
|
}
|
|
12086
11957
|
}
|
|
12087
|
-
function
|
|
12088
|
-
|
|
12089
|
-
|
|
12090
|
-
var faces = prediction.detections.map(function (d) {
|
|
12091
|
-
return {
|
|
12092
|
-
box: convertBoundingBox(d.boundingBox),
|
|
12093
|
-
keypoints: d.keypoints.map(function (k) {
|
|
12094
|
-
var _a;
|
|
12095
|
-
return _assign(_assign({}, k), {
|
|
12096
|
-
x: k.x * imageData.width,
|
|
12097
|
-
y: k.y * imageData.height,
|
|
12098
|
-
name: (_a = k.label) !== null && _a !== void 0 ? _a : ''
|
|
12099
|
-
});
|
|
12100
|
-
})
|
|
12101
|
-
};
|
|
11958
|
+
function isFaceDetection(detection) {
|
|
11959
|
+
return detection.boundingBox && detection.categories.some(function (c) {
|
|
11960
|
+
return c.categoryName === 'Primary face' || c.categoryName === 'Secondary face';
|
|
12102
11961
|
});
|
|
12103
|
-
|
|
12104
|
-
|
|
11962
|
+
}
|
|
11963
|
+
function isNoseDetection(detection) {
|
|
11964
|
+
return detection.categories.some(function (c) {
|
|
11965
|
+
return c.categoryName === 'Nose';
|
|
11966
|
+
});
|
|
11967
|
+
}
|
|
11968
|
+
function makeFacePredictionWithDocumentDetector(frame) {
|
|
11969
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11970
|
+
var prediction, faceDetections, noseDetections, _i, _a, detection, faces, _b, faceDetections_1, d, faceBox, nose, _c, noseDetections_1, n, noseBox, cX, cY;
|
|
11971
|
+
return __generator(this, function (_d) {
|
|
11972
|
+
switch (_d.label) {
|
|
11973
|
+
case 0:
|
|
11974
|
+
return [4 /*yield*/, makeDocumentDetectorPrediction(frame)];
|
|
11975
|
+
case 1:
|
|
11976
|
+
prediction = _d.sent();
|
|
11977
|
+
if (!prediction) return [2 /*return*/, null];
|
|
11978
|
+
faceDetections = [];
|
|
11979
|
+
noseDetections = [];
|
|
11980
|
+
for (_i = 0, _a = prediction.detections; _i < _a.length; _i++) {
|
|
11981
|
+
detection = _a[_i];
|
|
11982
|
+
if (isNoseDetection(detection)) {
|
|
11983
|
+
noseDetections.push(detection);
|
|
11984
|
+
} else if (isFaceDetection(detection)) {
|
|
11985
|
+
faceDetections.push(detection);
|
|
11986
|
+
}
|
|
11987
|
+
}
|
|
11988
|
+
faces = [];
|
|
11989
|
+
for (_b = 0, faceDetections_1 = faceDetections; _b < faceDetections_1.length; _b++) {
|
|
11990
|
+
d = faceDetections_1[_b];
|
|
11991
|
+
faceBox = d.boundingBox;
|
|
11992
|
+
if (!faceBox) continue;
|
|
11993
|
+
nose = null;
|
|
11994
|
+
for (_c = 0, noseDetections_1 = noseDetections; _c < noseDetections_1.length; _c++) {
|
|
11995
|
+
n = noseDetections_1[_c];
|
|
11996
|
+
noseBox = n.boundingBox;
|
|
11997
|
+
if (!noseBox) continue;
|
|
11998
|
+
cX = noseBox.originX + noseBox.width / 2;
|
|
11999
|
+
cY = noseBox.originY + noseBox.height / 2;
|
|
12000
|
+
if (cX >= faceBox.originX && cX <= faceBox.originX + faceBox.width && cY >= faceBox.originY && cY <= faceBox.originY + faceBox.height) {
|
|
12001
|
+
nose = {
|
|
12002
|
+
x: cX,
|
|
12003
|
+
y: cY,
|
|
12004
|
+
name: 'nose'
|
|
12005
|
+
};
|
|
12006
|
+
break;
|
|
12007
|
+
}
|
|
12008
|
+
}
|
|
12009
|
+
faces.push({
|
|
12010
|
+
box: convertBoundingBox(d.boundingBox),
|
|
12011
|
+
keypoints: [null, null, nose, null, null]
|
|
12012
|
+
});
|
|
12013
|
+
}
|
|
12014
|
+
debug('faces', faces);
|
|
12015
|
+
return [2 /*return*/, _assign(_assign({}, prediction), {
|
|
12016
|
+
faces: faces
|
|
12017
|
+
})];
|
|
12018
|
+
}
|
|
12019
|
+
});
|
|
12105
12020
|
});
|
|
12106
12021
|
}
|
|
12107
12022
|
function processFaceDetectorPrediction(_a) {
|
|
@@ -12129,13 +12044,9 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12129
12044
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video width
|
|
12130
12045
|
yCentroidBoundary = _h === void 0 ? 0.125 : _h,
|
|
12131
12046
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video height
|
|
12132
|
-
_j = _a.
|
|
12047
|
+
_j = _a.noseTrackingThreshold,
|
|
12133
12048
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video height
|
|
12134
|
-
|
|
12135
|
-
// we found that the bounding box ends at the brow and misses the forehead. this ratio represents how much we should extend the box to include the forehead.
|
|
12136
|
-
_k = _a.noseTrackingThreshold,
|
|
12137
|
-
// we found that the bounding box ends at the brow and misses the forehead. this ratio represents how much we should extend the box to include the forehead.
|
|
12138
|
-
noseTrackingThreshold = _k === void 0 ? 0.2 : _k,
|
|
12049
|
+
noseTrackingThreshold = _j === void 0 ? 0.2 : _j,
|
|
12139
12050
|
// this represents the maximum distance that the nose can be from the center of the face box -- 20% of the face box width or height
|
|
12140
12051
|
minCaptureBrightnessThreshold = _a.minCaptureBrightnessThreshold,
|
|
12141
12052
|
minCaptureRangeThreshold = _a.minCaptureRangeThreshold,
|
|
@@ -12162,10 +12073,10 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12162
12073
|
var frameCX = videoWidth / 2;
|
|
12163
12074
|
var frameCY = videoHeight / 2;
|
|
12164
12075
|
// calculate head bounding box, with forehead extension
|
|
12165
|
-
|
|
12076
|
+
// const foreheadSize = face.box.height * foreheadRatio
|
|
12166
12077
|
var headXMin = face.box.xMin;
|
|
12167
12078
|
var headXMax = face.box.xMax;
|
|
12168
|
-
var headYMin = face.box.yMin - foreheadSize
|
|
12079
|
+
var headYMin = face.box.yMin; // - foreheadSize
|
|
12169
12080
|
var headYMax = face.box.yMax;
|
|
12170
12081
|
// calculate head centroids
|
|
12171
12082
|
var headCX = (headXMin + headXMax) / 2;
|
|
@@ -12221,26 +12132,6 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12221
12132
|
faceVisibilityTooLow: faceVisibilityTooLow
|
|
12222
12133
|
};
|
|
12223
12134
|
}
|
|
12224
|
-
function testFaceDetectionAgainstKnownImage(detector) {
|
|
12225
|
-
return new Promise(function (resolve, reject) {
|
|
12226
|
-
var img = new Image();
|
|
12227
|
-
img.crossOrigin = 'anonymous';
|
|
12228
|
-
img.onload = function () {
|
|
12229
|
-
var prediction = detector.detectForVideo(img, performance.now());
|
|
12230
|
-
if (prediction.detections.length > 0) {
|
|
12231
|
-
debug('face detection test result', prediction.detections);
|
|
12232
|
-
resolve(void 0);
|
|
12233
|
-
} else {
|
|
12234
|
-
warn('face detection test failed');
|
|
12235
|
-
reject(new Error('testFaceDetectionAgainstKnownImage failed to predict'));
|
|
12236
|
-
}
|
|
12237
|
-
};
|
|
12238
|
-
img.onerror = function () {
|
|
12239
|
-
return reject(new Error('testFaceDetectionAgainstKnownImage failed to load image'));
|
|
12240
|
-
};
|
|
12241
|
-
img.src = "".concat(DEFAULT_CDN_URL, "/head-test.jpg");
|
|
12242
|
-
});
|
|
12243
|
-
}
|
|
12244
12135
|
|
|
12245
12136
|
function detectBrightnessAndContrast(frame, brightnessAverager) {
|
|
12246
12137
|
var ctx = frame.getContext('2d');
|
|
@@ -12392,16 +12283,27 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12392
12283
|
var canvasRef = React.useRef(null);
|
|
12393
12284
|
var onPredictionHandler = React.useRef();
|
|
12394
12285
|
var addToAverage = useRunningAvg(5).addToAverage;
|
|
12395
|
-
var _f =
|
|
12286
|
+
var _f = useLoadDocumentDetector({
|
|
12287
|
+
videoRef: videoRef,
|
|
12396
12288
|
onModelError: onModelError,
|
|
12397
|
-
modelLoadTimeoutMs: modelLoadTimeoutMs
|
|
12398
|
-
videoRef: videoRef
|
|
12289
|
+
modelLoadTimeoutMs: modelLoadTimeoutMs
|
|
12399
12290
|
}),
|
|
12400
12291
|
ready = _f.ready,
|
|
12401
12292
|
modelLoadState = _f.modelLoadState,
|
|
12402
12293
|
modelDownloadProgress = _f.modelDownloadProgress,
|
|
12403
12294
|
modelWarmingStartedAt = _f.modelWarmingStartedAt,
|
|
12404
12295
|
modelError = _f.modelError;
|
|
12296
|
+
// const {
|
|
12297
|
+
// ready,
|
|
12298
|
+
// modelLoadState,
|
|
12299
|
+
// modelDownloadProgress,
|
|
12300
|
+
// modelWarmingStartedAt,
|
|
12301
|
+
// modelError,
|
|
12302
|
+
// } = useLoadFaceDetector({
|
|
12303
|
+
// onModelError,
|
|
12304
|
+
// modelLoadTimeoutMs,
|
|
12305
|
+
// videoRef,
|
|
12306
|
+
// })
|
|
12405
12307
|
var _g = useFrameLoop(React.useCallback(function () {
|
|
12406
12308
|
return __awaiter(_this, void 0, void 0, function () {
|
|
12407
12309
|
var vw, vh, ctx, thresholdsProvided, brightnessResults, brightness, range, variance, prediction, processed, e_1;
|
|
@@ -12415,19 +12317,21 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12415
12317
|
ctx = canvasRef.current.getContext('2d');
|
|
12416
12318
|
canvasRef.current.width = vw;
|
|
12417
12319
|
canvasRef.current.height = vh;
|
|
12418
|
-
if (!(ctx && videoRef.current.readyState === 4)) return [3 /*break*/,
|
|
12320
|
+
if (!(ctx && videoRef.current.readyState === 4)) return [3 /*break*/, 5];
|
|
12419
12321
|
ctx.translate(vw, 0);
|
|
12420
12322
|
ctx.scale(-1, 1);
|
|
12421
12323
|
ctx.drawImage(videoRef.current, 0, 0, vw, vh);
|
|
12422
12324
|
_c.label = 1;
|
|
12423
12325
|
case 1:
|
|
12424
|
-
_c.trys.push([1,
|
|
12326
|
+
_c.trys.push([1, 4,, 5]);
|
|
12425
12327
|
thresholdsProvided = minCaptureBrightnessThreshold !== undefined || minCaptureRangeThreshold !== undefined || minCaptureVarianceThreshold !== undefined;
|
|
12426
12328
|
brightnessResults = thresholdsProvided ? detectBrightnessAndContrast(canvasRef.current, addToAverage) : undefined;
|
|
12427
12329
|
brightness = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.brightness;
|
|
12428
12330
|
range = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.range;
|
|
12429
12331
|
variance = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.variance;
|
|
12430
|
-
|
|
12332
|
+
return [4 /*yield*/, makeFacePredictionWithDocumentDetector(canvasRef.current)];
|
|
12333
|
+
case 2:
|
|
12334
|
+
prediction = _c.sent();
|
|
12431
12335
|
processed = processFaceDetectorPrediction({
|
|
12432
12336
|
faces: (_a = prediction === null || prediction === void 0 ? void 0 : prediction.faces) !== null && _a !== void 0 ? _a : [],
|
|
12433
12337
|
videoWidth: vw,
|
|
@@ -12443,15 +12347,15 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12443
12347
|
setLastFaceDetectionAt(new Date().getTime());
|
|
12444
12348
|
// setLastPrediction(processed)
|
|
12445
12349
|
return [4 /*yield*/, (_b = onPredictionHandler.current) === null || _b === void 0 ? void 0 : _b.call(onPredictionHandler, processed)];
|
|
12446
|
-
case
|
|
12350
|
+
case 3:
|
|
12447
12351
|
// setLastPrediction(processed)
|
|
12448
12352
|
_c.sent();
|
|
12449
|
-
return [3 /*break*/,
|
|
12450
|
-
case
|
|
12353
|
+
return [3 /*break*/, 5];
|
|
12354
|
+
case 4:
|
|
12451
12355
|
e_1 = _c.sent();
|
|
12452
12356
|
error('caught face detection error', e_1);
|
|
12453
|
-
return [3 /*break*/,
|
|
12454
|
-
case
|
|
12357
|
+
return [3 /*break*/, 5];
|
|
12358
|
+
case 5:
|
|
12455
12359
|
return [2 /*return*/];
|
|
12456
12360
|
}
|
|
12457
12361
|
});
|
|
@@ -14988,7 +14892,8 @@ function VideoSignatureCaptureComponent(_a, ref) {
|
|
|
14988
14892
|
var rightEdge = videoWidth * (1 - headTrackingBoundaryPercentage);
|
|
14989
14893
|
var topEdge = videoHeight * headTrackingBoundaryPercentage;
|
|
14990
14894
|
var bottomEdge = videoHeight * (1 - headTrackingBoundaryPercentage);
|
|
14991
|
-
var
|
|
14895
|
+
var nose = face === null || face === void 0 ? void 0 : face.keypoints[2];
|
|
14896
|
+
var nearBoundary = !!face && !!nose && (headTrackingBoundaryType === 'nose' ? nose.x < leftEdge || nose.x > rightEdge || nose.y < topEdge || nose.y > bottomEdge : (face === null || face === void 0 ? void 0 : face.box.xMin) < leftEdge || (face === null || face === void 0 ? void 0 : face.box.xMax) > rightEdge || (face === null || face === void 0 ? void 0 : face.box.yMin) < topEdge || (face === null || face === void 0 ? void 0 : face.box.yMax) > bottomEdge);
|
|
14992
14897
|
setLastFace(face);
|
|
14993
14898
|
setHeadTrackingSatisfied(!!face && !nearBoundary);
|
|
14994
14899
|
setNumFramesWithoutFaces(face ? 0 : function (n) {
|
|
@@ -15469,6 +15374,7 @@ function VideoSignatureWizardComponent(_a, ref) {
|
|
|
15469
15374
|
return n + 1;
|
|
15470
15375
|
});
|
|
15471
15376
|
setCaptureState(skipLivenessValidation ? 'CAPTURING_SELFIE' : 'CHECKING_LIVENESS');
|
|
15377
|
+
useVideoSignatureStore.getState().clearRecordedData();
|
|
15472
15378
|
}, [onRetryClicked, skipLivenessValidation]);
|
|
15473
15379
|
var onExitSignatureCapture = React.useCallback(function () {
|
|
15474
15380
|
setAttempt(function (n) {
|
|
@@ -15936,6 +15842,16 @@ var useVideoRecorderStore = zustand.create()(middleware.devtools(function (set,
|
|
|
15936
15842
|
clearRecordedData: function clearRecordedData() {
|
|
15937
15843
|
clearVideoChunks();
|
|
15938
15844
|
clearAudioChunks();
|
|
15845
|
+
set({
|
|
15846
|
+
videoUrl: null,
|
|
15847
|
+
audioUrl: null,
|
|
15848
|
+
isRecordingVideo: false,
|
|
15849
|
+
isRecordingAudio: false,
|
|
15850
|
+
videoRecordingStopped: false,
|
|
15851
|
+
audioRecordingStopped: false,
|
|
15852
|
+
videoRecordingIntentionallyStopped: false,
|
|
15853
|
+
audioRecordingIntentionallyStopped: false
|
|
15854
|
+
});
|
|
15939
15855
|
}
|
|
15940
15856
|
});
|
|
15941
15857
|
}));
|
|
@@ -16218,10 +16134,10 @@ var IdVideoCapture = function IdVideoCapture(_a) {
|
|
|
16218
16134
|
var _14 = React.useState(null),
|
|
16219
16135
|
videoStartsAt = _14[0],
|
|
16220
16136
|
setVideoStartsAt = _14[1];
|
|
16221
|
-
var _15 =
|
|
16137
|
+
var _15 = useSubmissionContext(),
|
|
16222
16138
|
setIdCaptureVideoAudioStartsAt = _15.setIdCaptureVideoAudioStartsAt,
|
|
16223
16139
|
setExpectedAudioText = _15.setExpectedAudioText;
|
|
16224
|
-
var _16 =
|
|
16140
|
+
var _16 = useSelfieGuidanceModelsContext(),
|
|
16225
16141
|
startSelfieGuidance = _16.start,
|
|
16226
16142
|
stopSelfieGuidance = _16.stop,
|
|
16227
16143
|
onSelfiePredictionMade = _16.onPredictionMade,
|
|
@@ -16818,6 +16734,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16818
16734
|
return n + 1;
|
|
16819
16735
|
});
|
|
16820
16736
|
setCaptureState('CAPTURING_ID');
|
|
16737
|
+
useVideoRecorderStore.getState().clearRecordedData();
|
|
16821
16738
|
}, []);
|
|
16822
16739
|
var isCapturingId = !skipIdCapture && ['LOADING', 'CAPTURING_ID'].includes(captureState);
|
|
16823
16740
|
React.useEffect(function () {
|
|
@@ -16852,6 +16769,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16852
16769
|
});
|
|
16853
16770
|
}, [capturedIdDocumentType, (_b = classNames.idVideoCapture) === null || _b === void 0 ? void 0 : _b.guides, (_c = colors.idVideoCapture) === null || _c === void 0 ? void 0 : _c.guidesSatisfiedColor, (_d = colors.idVideoCapture) === null || _d === void 0 ? void 0 : _d.guidesUnsatisfiedColor, idCaptureGuideImages, (_e = verbiage.idVideoCapture) === null || _e === void 0 ? void 0 : _e.guides]);
|
|
16854
16771
|
return /*#__PURE__*/React__namespace.default.createElement(CameraStoreProvider, {
|
|
16772
|
+
key: "camera-store-".concat(attempt),
|
|
16855
16773
|
preferIphoneContinuityCamera: isCapturingId,
|
|
16856
16774
|
preferFrontFacingCamera: !isCapturingId,
|
|
16857
16775
|
requireMicrophoneAccess: !isCapturingId && !!readTextPrompt,
|
|
@@ -16863,6 +16781,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16863
16781
|
classNames: classNames === null || classNames === void 0 ? void 0 : classNames.cameraStoreProvider,
|
|
16864
16782
|
verbiage: verbiage === null || verbiage === void 0 ? void 0 : verbiage.cameraStoreProvider
|
|
16865
16783
|
}, /*#__PURE__*/React__namespace.default.createElement(IdCaptureModelsProvider, {
|
|
16784
|
+
key: "id-capture-models-".concat(attempt),
|
|
16866
16785
|
autoStart: false,
|
|
16867
16786
|
documentDetectionModelUrl: (_g = (_f = idCaptureProps.assets) === null || _f === void 0 ? void 0 : _f.documentDetectionModelUrl) !== null && _g !== void 0 ? _g : '',
|
|
16868
16787
|
focusModelUrl: (_j = (_h = idCaptureProps.assets) === null || _h === void 0 ? void 0 : _h.focusModelUrl) !== null && _j !== void 0 ? _j : '',
|
|
@@ -16870,6 +16789,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16870
16789
|
modelLoadTimeoutMs: idCaptureModelLoadTimeoutMs,
|
|
16871
16790
|
allowSinglePageIdCapture: idCaptureProps.allowSinglePageIdCapture
|
|
16872
16791
|
}, /*#__PURE__*/React__namespace.default.createElement(SelfieGuidanceModelsProvider, {
|
|
16792
|
+
key: "selfie-guidance-models-".concat(attempt),
|
|
16873
16793
|
autoStart: false,
|
|
16874
16794
|
onModelError: faceLivenessProps === null || faceLivenessProps === void 0 ? void 0 : faceLivenessProps.onModelError,
|
|
16875
16795
|
modelLoadTimeoutMs: faceLivenessProps === null || faceLivenessProps === void 0 ? void 0 : faceLivenessProps.modelLoadTimeoutMs,
|
|
@@ -16879,7 +16799,9 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16879
16799
|
})), function () {
|
|
16880
16800
|
switch (captureState) {
|
|
16881
16801
|
case 'CAPTURING_ID':
|
|
16882
|
-
return /*#__PURE__*/React__namespace.default.createElement(IdCaptureStateProvider,
|
|
16802
|
+
return /*#__PURE__*/React__namespace.default.createElement(IdCaptureStateProvider, {
|
|
16803
|
+
key: "id-capture-state-".concat(attempt)
|
|
16804
|
+
}, /*#__PURE__*/React__namespace.default.createElement(GuideOrientationContextProvider, null, /*#__PURE__*/React__namespace.default.createElement(IdCaptureWizard, _assign({
|
|
16883
16805
|
key: "id-capture-".concat(attempt),
|
|
16884
16806
|
loadingOverlayMode: idCaptureLoadingOverlayMode,
|
|
16885
16807
|
customOverlayContent: customOverlayContent,
|