idmission-web-sdk 2.3.113 → 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/VideoSignatureContext.d.ts +2 -0
- package/dist/components/video_signature_capture/VideoSignatureContext.d.ts.map +1 -1
- package/dist/components/video_signature_capture/VideoSignatureGuides.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 +142 -212
- 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 +143 -213
- package/dist/sdk2.esm.js.map +1 -1
- package/dist/sdk2.umd.development.js +142 -212
- 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
package/dist/sdk2.esm.js
CHANGED
|
@@ -7,7 +7,7 @@ import { createPortal } from 'react-dom';
|
|
|
7
7
|
import { useTranslation, initReactI18next } from 'react-i18next';
|
|
8
8
|
import { Upload } from 'tus-js-client';
|
|
9
9
|
import SparkMD5 from 'spark-md5';
|
|
10
|
-
import { ImageSegmenter, FilesetResolver, ObjectDetector, ImageClassifier
|
|
10
|
+
import { ImageSegmenter, FilesetResolver, ObjectDetector, ImageClassifier } from '@mediapipe/tasks-vision';
|
|
11
11
|
import { useStore, createStore, create } from 'zustand';
|
|
12
12
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
|
13
13
|
import i18n from 'i18next';
|
|
@@ -205,7 +205,7 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
205
205
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
206
206
|
};
|
|
207
207
|
|
|
208
|
-
var webSdkVersion = '2.3.
|
|
208
|
+
var webSdkVersion = '2.3.115';
|
|
209
209
|
|
|
210
210
|
function getPlatform() {
|
|
211
211
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
@@ -2348,8 +2348,8 @@ function giveUpAfter(maxTime) {
|
|
|
2348
2348
|
|
|
2349
2349
|
var DEFAULT_CDN_URL = 'https://websdk-cdn-dev.idmission.com/assets';
|
|
2350
2350
|
|
|
2351
|
-
var defaultDocumentDetectorModelPath = "".concat(DEFAULT_CDN_URL, "/models/DocumentDetector/DocumentDetector-
|
|
2352
|
-
var defaultDocumentDetectorModelHash = '
|
|
2351
|
+
var defaultDocumentDetectorModelPath = "".concat(DEFAULT_CDN_URL, "/models/DocumentDetector/DocumentDetector-20251018_121234.tflite");
|
|
2352
|
+
var defaultDocumentDetectorModelHash = 'cTLjb4g6H+a+RHnLaYrvVF8050qv/Ox04rMtxFXBDR6Xv8Pv+X//hsaO3K3jNPog';
|
|
2353
2353
|
|
|
2354
2354
|
var defaultFocusModelPath = "".concat(DEFAULT_CDN_URL, "/models/Focus/Focus-20241008_102708.tflite");
|
|
2355
2355
|
var defaultFocusModelHash = 'HTJNLB7QybtPXIIyUI9oNqW40vE5bgSV5V24R1wXLQHknNEVOSyDQDo/QzRgJ8jb';
|
|
@@ -2666,8 +2666,8 @@ var documentTypeDisplayNames = {
|
|
|
2666
2666
|
singlePage: 'Single page',
|
|
2667
2667
|
none: 'None'
|
|
2668
2668
|
};
|
|
2669
|
-
var detector
|
|
2670
|
-
var detectorSettings
|
|
2669
|
+
var detector = null;
|
|
2670
|
+
var detectorSettings = null;
|
|
2671
2671
|
function loadDocumentDetector() {
|
|
2672
2672
|
return __awaiter(this, arguments, void 0, function (modelAssetPath, scoreThreshold) {
|
|
2673
2673
|
var _a, _b;
|
|
@@ -2680,7 +2680,7 @@ function loadDocumentDetector() {
|
|
|
2680
2680
|
return __generator(this, function (_c) {
|
|
2681
2681
|
switch (_c.label) {
|
|
2682
2682
|
case 0:
|
|
2683
|
-
if (detector
|
|
2683
|
+
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];
|
|
2684
2684
|
closeDocumentDetector();
|
|
2685
2685
|
return [4 /*yield*/, preloadDocumentDetectorDependencies()];
|
|
2686
2686
|
case 1:
|
|
@@ -2701,20 +2701,20 @@ function loadDocumentDetector() {
|
|
|
2701
2701
|
runningMode: 'VIDEO'
|
|
2702
2702
|
}])];
|
|
2703
2703
|
case 3:
|
|
2704
|
-
detector
|
|
2705
|
-
detectorSettings
|
|
2704
|
+
detector = _c.sent();
|
|
2705
|
+
detectorSettings = {
|
|
2706
2706
|
modelAssetPath: modelAssetPath,
|
|
2707
2707
|
scoreThreshold: scoreThreshold
|
|
2708
2708
|
};
|
|
2709
|
-
return [2 /*return*/, detector
|
|
2709
|
+
return [2 /*return*/, detector];
|
|
2710
2710
|
}
|
|
2711
2711
|
});
|
|
2712
2712
|
});
|
|
2713
2713
|
}
|
|
2714
2714
|
function closeDocumentDetector() {
|
|
2715
|
-
detector
|
|
2716
|
-
detector
|
|
2717
|
-
detectorSettings
|
|
2715
|
+
detector === null || detector === void 0 ? void 0 : detector.close();
|
|
2716
|
+
detector = null;
|
|
2717
|
+
detectorSettings = null;
|
|
2718
2718
|
}
|
|
2719
2719
|
function useLoadDocumentDetector(_a) {
|
|
2720
2720
|
var _b = _a.shouldLoadModels,
|
|
@@ -2815,12 +2815,12 @@ function makeDocumentDetectorPrediction(frame) {
|
|
|
2815
2815
|
return __awaiter(this, void 0, void 0, function () {
|
|
2816
2816
|
var startedAt, prediction, time, frameWidth, frameHeight;
|
|
2817
2817
|
return __generator(this, function (_a) {
|
|
2818
|
-
if (!detector
|
|
2818
|
+
if (!detector) return [2 /*return*/, null];
|
|
2819
2819
|
startedAt = performance.now();
|
|
2820
2820
|
// Detectors can throw errors, for example when using custom URLs that
|
|
2821
2821
|
// contain a model that doesn't provide the expected output.
|
|
2822
2822
|
try {
|
|
2823
|
-
prediction = detector
|
|
2823
|
+
prediction = detector.detectForVideo(frame, performance.now());
|
|
2824
2824
|
time = performance.now() - startedAt;
|
|
2825
2825
|
frameWidth = frame.width;
|
|
2826
2826
|
frameHeight = frame.height;
|
|
@@ -6800,6 +6800,7 @@ function SelfieCaptureFaceKeypoint(_a) {
|
|
|
6800
6800
|
scaledHeight = _c.scaledHeight,
|
|
6801
6801
|
xOffset = _c.xOffset,
|
|
6802
6802
|
yOffset = _c.yOffset;
|
|
6803
|
+
if (!point) return /*#__PURE__*/React__default.createElement(React__default.Fragment, null);
|
|
6803
6804
|
var left, top;
|
|
6804
6805
|
if (horizontal) {
|
|
6805
6806
|
left = point.x / videoWidth * scaledWidth - xOffset;
|
|
@@ -11874,136 +11875,6 @@ var FaceCaptureGuideOverlay = function FaceCaptureGuideOverlay(_a) {
|
|
|
11874
11875
|
var templateObject_1$n, templateObject_2$l;
|
|
11875
11876
|
|
|
11876
11877
|
var defaultSelfieCaptureModelLoadTimeoutMs = 45000;
|
|
11877
|
-
var detector = null;
|
|
11878
|
-
var detectorSettings = null;
|
|
11879
|
-
function loadFaceDetector() {
|
|
11880
|
-
return __awaiter(this, arguments, void 0, function (modelAssetPath) {
|
|
11881
|
-
var _a, _b;
|
|
11882
|
-
if (modelAssetPath === void 0) {
|
|
11883
|
-
modelAssetPath = defaultFaceDetectorModelPath;
|
|
11884
|
-
}
|
|
11885
|
-
return __generator(this, function (_c) {
|
|
11886
|
-
switch (_c.label) {
|
|
11887
|
-
case 0:
|
|
11888
|
-
if (detector && (detectorSettings === null || detectorSettings === void 0 ? void 0 : detectorSettings.modelAssetPath) === modelAssetPath) return [2 /*return*/, detector];
|
|
11889
|
-
closeFaceDetector();
|
|
11890
|
-
return [4 /*yield*/, preloadFaceDetectorDependencies()];
|
|
11891
|
-
case 1:
|
|
11892
|
-
_c.sent();
|
|
11893
|
-
if (modelCapabilities.delegate === 'NONE') {
|
|
11894
|
-
throw new Error('No available delegate for face detector.');
|
|
11895
|
-
}
|
|
11896
|
-
_b = (_a = FaceDetector).createFromOptions;
|
|
11897
|
-
return [4 /*yield*/, FilesetResolver.forVisionTasks(visionTasksBasePath)];
|
|
11898
|
-
case 2:
|
|
11899
|
-
return [4 /*yield*/, _b.apply(_a, [_c.sent(), {
|
|
11900
|
-
// canvas: document.createElement('canvas'),
|
|
11901
|
-
baseOptions: {
|
|
11902
|
-
modelAssetPath: modelAssetPath,
|
|
11903
|
-
delegate: modelCapabilities.delegate
|
|
11904
|
-
},
|
|
11905
|
-
runningMode: 'VIDEO'
|
|
11906
|
-
}])];
|
|
11907
|
-
case 3:
|
|
11908
|
-
detector = _c.sent();
|
|
11909
|
-
detectorSettings = {
|
|
11910
|
-
modelAssetPath: modelAssetPath
|
|
11911
|
-
};
|
|
11912
|
-
return [2 /*return*/, detector];
|
|
11913
|
-
}
|
|
11914
|
-
});
|
|
11915
|
-
});
|
|
11916
|
-
}
|
|
11917
|
-
function closeFaceDetector() {
|
|
11918
|
-
detector === null || detector === void 0 ? void 0 : detector.close();
|
|
11919
|
-
detector = null;
|
|
11920
|
-
detectorSettings = null;
|
|
11921
|
-
}
|
|
11922
|
-
function useLoadFaceDetector(_a) {
|
|
11923
|
-
var onModelError = _a.onModelError,
|
|
11924
|
-
_b = _a.modelLoadTimeoutMs,
|
|
11925
|
-
modelLoadTimeoutMs = _b === void 0 ? defaultSelfieCaptureModelLoadTimeoutMs : _b,
|
|
11926
|
-
videoRef = _a.videoRef;
|
|
11927
|
-
var _c = useState('not-started'),
|
|
11928
|
-
modelLoadState = _c[0],
|
|
11929
|
-
setModelLoadState = _c[1];
|
|
11930
|
-
var _d = useState(0),
|
|
11931
|
-
modelDownloadProgress = _d[0],
|
|
11932
|
-
setModelDownloadProgress = _d[1];
|
|
11933
|
-
var _e = useState(null),
|
|
11934
|
-
modelWarmingStartedAt = _e[0],
|
|
11935
|
-
setModelWarmingStartedAt = _e[1];
|
|
11936
|
-
var _f = useState(null),
|
|
11937
|
-
modelError = _f[0],
|
|
11938
|
-
setModelError = _f[1];
|
|
11939
|
-
useEffect(function loadModel() {
|
|
11940
|
-
var _this = this;
|
|
11941
|
-
setModelLoadState('downloading');
|
|
11942
|
-
setModelWarmingStartedAt(null);
|
|
11943
|
-
var modelLoadTimeout = setTimeout(function () {
|
|
11944
|
-
setModelError(new Error('Model loading time limit exceeded.'));
|
|
11945
|
-
}, modelLoadTimeoutMs);
|
|
11946
|
-
function handleDownloadProgress(event) {
|
|
11947
|
-
setModelDownloadProgress(progressToPercentage(event.detail));
|
|
11948
|
-
}
|
|
11949
|
-
document.addEventListener('idmission.preloadProgress.faceDetection', handleDownloadProgress);
|
|
11950
|
-
var cancelVideoReady = function cancelVideoReady() {};
|
|
11951
|
-
loadFaceDetector().then(function (model) {
|
|
11952
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
11953
|
-
var _a, videoReady, cancel, cancelled;
|
|
11954
|
-
return __generator(this, function (_b) {
|
|
11955
|
-
switch (_b.label) {
|
|
11956
|
-
case 0:
|
|
11957
|
-
setModelDownloadProgress(100);
|
|
11958
|
-
clearTimeout(modelLoadTimeout);
|
|
11959
|
-
setModelLoadState('warming');
|
|
11960
|
-
setModelWarmingStartedAt(performance.now());
|
|
11961
|
-
return [4 /*yield*/, testFaceDetectionAgainstKnownImage(model)];
|
|
11962
|
-
case 1:
|
|
11963
|
-
_b.sent();
|
|
11964
|
-
_a = waitForVideoReady(videoRef), videoReady = _a[0], cancel = _a[1];
|
|
11965
|
-
cancelled = false;
|
|
11966
|
-
cancelVideoReady = function cancelVideoReady() {
|
|
11967
|
-
cancelled = true;
|
|
11968
|
-
cancel();
|
|
11969
|
-
};
|
|
11970
|
-
return [4 /*yield*/, videoReady];
|
|
11971
|
-
case 2:
|
|
11972
|
-
_b.sent();
|
|
11973
|
-
if (cancelled) return [2 /*return*/];
|
|
11974
|
-
model.detectForVideo(videoRef.current, performance.now());
|
|
11975
|
-
setModelLoadState('ready');
|
|
11976
|
-
return [2 /*return*/];
|
|
11977
|
-
}
|
|
11978
|
-
});
|
|
11979
|
-
});
|
|
11980
|
-
})["catch"](function (e) {
|
|
11981
|
-
setModelError(e);
|
|
11982
|
-
setModelLoadState('error');
|
|
11983
|
-
})["finally"](function () {
|
|
11984
|
-
clearTimeout(modelLoadTimeout);
|
|
11985
|
-
});
|
|
11986
|
-
return function () {
|
|
11987
|
-
log('unloading face detection model');
|
|
11988
|
-
cancelVideoReady();
|
|
11989
|
-
closeFaceDetector();
|
|
11990
|
-
clearTimeout(modelLoadTimeout);
|
|
11991
|
-
document.removeEventListener('idmission.preloadProgress.faceDetection', handleDownloadProgress);
|
|
11992
|
-
};
|
|
11993
|
-
}, [modelLoadTimeoutMs, videoRef]);
|
|
11994
|
-
useEffect(function handleModelError() {
|
|
11995
|
-
if (modelError) onModelError === null || onModelError === void 0 ? void 0 : onModelError(modelError);
|
|
11996
|
-
}, [modelError, onModelError]);
|
|
11997
|
-
return useMemo(function () {
|
|
11998
|
-
return {
|
|
11999
|
-
ready: modelLoadState === 'ready',
|
|
12000
|
-
modelLoadState: modelLoadState,
|
|
12001
|
-
modelDownloadProgress: modelDownloadProgress,
|
|
12002
|
-
modelWarmingStartedAt: modelWarmingStartedAt,
|
|
12003
|
-
modelError: modelError
|
|
12004
|
-
};
|
|
12005
|
-
}, [modelLoadState, modelDownloadProgress, modelWarmingStartedAt, modelError]);
|
|
12006
|
-
}
|
|
12007
11878
|
var lastFaceDetectionAt = 0;
|
|
12008
11879
|
var lastFaceDetectionTime = 0;
|
|
12009
11880
|
function setLastFaceDetectionAt(time) {
|
|
@@ -12053,24 +11924,68 @@ function trackFace(face, framesNeeded, frameWidth, frameHeight) {
|
|
|
12053
11924
|
if (lastNNosePairs.length > framesNeeded - 1) lastNNosePairs.length = framesNeeded - 1;
|
|
12054
11925
|
}
|
|
12055
11926
|
}
|
|
12056
|
-
function
|
|
12057
|
-
|
|
12058
|
-
|
|
12059
|
-
var faces = prediction.detections.map(function (d) {
|
|
12060
|
-
return {
|
|
12061
|
-
box: convertBoundingBox(d.boundingBox),
|
|
12062
|
-
keypoints: d.keypoints.map(function (k) {
|
|
12063
|
-
var _a;
|
|
12064
|
-
return _assign(_assign({}, k), {
|
|
12065
|
-
x: k.x * imageData.width,
|
|
12066
|
-
y: k.y * imageData.height,
|
|
12067
|
-
name: (_a = k.label) !== null && _a !== void 0 ? _a : ''
|
|
12068
|
-
});
|
|
12069
|
-
})
|
|
12070
|
-
};
|
|
11927
|
+
function isFaceDetection(detection) {
|
|
11928
|
+
return detection.boundingBox && detection.categories.some(function (c) {
|
|
11929
|
+
return c.categoryName === 'Primary face' || c.categoryName === 'Secondary face';
|
|
12071
11930
|
});
|
|
12072
|
-
|
|
12073
|
-
|
|
11931
|
+
}
|
|
11932
|
+
function isNoseDetection(detection) {
|
|
11933
|
+
return detection.categories.some(function (c) {
|
|
11934
|
+
return c.categoryName === 'Nose';
|
|
11935
|
+
});
|
|
11936
|
+
}
|
|
11937
|
+
function makeFacePredictionWithDocumentDetector(frame) {
|
|
11938
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11939
|
+
var prediction, faceDetections, noseDetections, _i, _a, detection, faces, _b, faceDetections_1, d, faceBox, nose, _c, noseDetections_1, n, noseBox, cX, cY;
|
|
11940
|
+
return __generator(this, function (_d) {
|
|
11941
|
+
switch (_d.label) {
|
|
11942
|
+
case 0:
|
|
11943
|
+
return [4 /*yield*/, makeDocumentDetectorPrediction(frame)];
|
|
11944
|
+
case 1:
|
|
11945
|
+
prediction = _d.sent();
|
|
11946
|
+
if (!prediction) return [2 /*return*/, null];
|
|
11947
|
+
faceDetections = [];
|
|
11948
|
+
noseDetections = [];
|
|
11949
|
+
for (_i = 0, _a = prediction.detections; _i < _a.length; _i++) {
|
|
11950
|
+
detection = _a[_i];
|
|
11951
|
+
if (isNoseDetection(detection)) {
|
|
11952
|
+
noseDetections.push(detection);
|
|
11953
|
+
} else if (isFaceDetection(detection)) {
|
|
11954
|
+
faceDetections.push(detection);
|
|
11955
|
+
}
|
|
11956
|
+
}
|
|
11957
|
+
faces = [];
|
|
11958
|
+
for (_b = 0, faceDetections_1 = faceDetections; _b < faceDetections_1.length; _b++) {
|
|
11959
|
+
d = faceDetections_1[_b];
|
|
11960
|
+
faceBox = d.boundingBox;
|
|
11961
|
+
if (!faceBox) continue;
|
|
11962
|
+
nose = null;
|
|
11963
|
+
for (_c = 0, noseDetections_1 = noseDetections; _c < noseDetections_1.length; _c++) {
|
|
11964
|
+
n = noseDetections_1[_c];
|
|
11965
|
+
noseBox = n.boundingBox;
|
|
11966
|
+
if (!noseBox) continue;
|
|
11967
|
+
cX = noseBox.originX + noseBox.width / 2;
|
|
11968
|
+
cY = noseBox.originY + noseBox.height / 2;
|
|
11969
|
+
if (cX >= faceBox.originX && cX <= faceBox.originX + faceBox.width && cY >= faceBox.originY && cY <= faceBox.originY + faceBox.height) {
|
|
11970
|
+
nose = {
|
|
11971
|
+
x: cX,
|
|
11972
|
+
y: cY,
|
|
11973
|
+
name: 'nose'
|
|
11974
|
+
};
|
|
11975
|
+
break;
|
|
11976
|
+
}
|
|
11977
|
+
}
|
|
11978
|
+
faces.push({
|
|
11979
|
+
box: convertBoundingBox(d.boundingBox),
|
|
11980
|
+
keypoints: [null, null, nose, null, null]
|
|
11981
|
+
});
|
|
11982
|
+
}
|
|
11983
|
+
debug('faces', faces);
|
|
11984
|
+
return [2 /*return*/, _assign(_assign({}, prediction), {
|
|
11985
|
+
faces: faces
|
|
11986
|
+
})];
|
|
11987
|
+
}
|
|
11988
|
+
});
|
|
12074
11989
|
});
|
|
12075
11990
|
}
|
|
12076
11991
|
function processFaceDetectorPrediction(_a) {
|
|
@@ -12098,13 +12013,9 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12098
12013
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video width
|
|
12099
12014
|
yCentroidBoundary = _h === void 0 ? 0.125 : _h,
|
|
12100
12015
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video height
|
|
12101
|
-
_j = _a.
|
|
12016
|
+
_j = _a.noseTrackingThreshold,
|
|
12102
12017
|
// this represents the edge that the centroid of the face should not cross -- 12.5% of video height
|
|
12103
|
-
|
|
12104
|
-
// 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.
|
|
12105
|
-
_k = _a.noseTrackingThreshold,
|
|
12106
|
-
// 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.
|
|
12107
|
-
noseTrackingThreshold = _k === void 0 ? 0.2 : _k,
|
|
12018
|
+
noseTrackingThreshold = _j === void 0 ? 0.2 : _j,
|
|
12108
12019
|
// 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
|
|
12109
12020
|
minCaptureBrightnessThreshold = _a.minCaptureBrightnessThreshold,
|
|
12110
12021
|
minCaptureRangeThreshold = _a.minCaptureRangeThreshold,
|
|
@@ -12131,10 +12042,10 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12131
12042
|
var frameCX = videoWidth / 2;
|
|
12132
12043
|
var frameCY = videoHeight / 2;
|
|
12133
12044
|
// calculate head bounding box, with forehead extension
|
|
12134
|
-
|
|
12045
|
+
// const foreheadSize = face.box.height * foreheadRatio
|
|
12135
12046
|
var headXMin = face.box.xMin;
|
|
12136
12047
|
var headXMax = face.box.xMax;
|
|
12137
|
-
var headYMin = face.box.yMin - foreheadSize
|
|
12048
|
+
var headYMin = face.box.yMin; // - foreheadSize
|
|
12138
12049
|
var headYMax = face.box.yMax;
|
|
12139
12050
|
// calculate head centroids
|
|
12140
12051
|
var headCX = (headXMin + headXMax) / 2;
|
|
@@ -12190,26 +12101,6 @@ function processFaceDetectorPrediction(_a) {
|
|
|
12190
12101
|
faceVisibilityTooLow: faceVisibilityTooLow
|
|
12191
12102
|
};
|
|
12192
12103
|
}
|
|
12193
|
-
function testFaceDetectionAgainstKnownImage(detector) {
|
|
12194
|
-
return new Promise(function (resolve, reject) {
|
|
12195
|
-
var img = new Image();
|
|
12196
|
-
img.crossOrigin = 'anonymous';
|
|
12197
|
-
img.onload = function () {
|
|
12198
|
-
var prediction = detector.detectForVideo(img, performance.now());
|
|
12199
|
-
if (prediction.detections.length > 0) {
|
|
12200
|
-
debug('face detection test result', prediction.detections);
|
|
12201
|
-
resolve(void 0);
|
|
12202
|
-
} else {
|
|
12203
|
-
warn('face detection test failed');
|
|
12204
|
-
reject(new Error('testFaceDetectionAgainstKnownImage failed to predict'));
|
|
12205
|
-
}
|
|
12206
|
-
};
|
|
12207
|
-
img.onerror = function () {
|
|
12208
|
-
return reject(new Error('testFaceDetectionAgainstKnownImage failed to load image'));
|
|
12209
|
-
};
|
|
12210
|
-
img.src = "".concat(DEFAULT_CDN_URL, "/head-test.jpg");
|
|
12211
|
-
});
|
|
12212
|
-
}
|
|
12213
12104
|
|
|
12214
12105
|
function detectBrightnessAndContrast(frame, brightnessAverager) {
|
|
12215
12106
|
var ctx = frame.getContext('2d');
|
|
@@ -12361,16 +12252,27 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12361
12252
|
var canvasRef = useRef(null);
|
|
12362
12253
|
var onPredictionHandler = useRef();
|
|
12363
12254
|
var addToAverage = useRunningAvg(5).addToAverage;
|
|
12364
|
-
var _f =
|
|
12255
|
+
var _f = useLoadDocumentDetector({
|
|
12256
|
+
videoRef: videoRef,
|
|
12365
12257
|
onModelError: onModelError,
|
|
12366
|
-
modelLoadTimeoutMs: modelLoadTimeoutMs
|
|
12367
|
-
videoRef: videoRef
|
|
12258
|
+
modelLoadTimeoutMs: modelLoadTimeoutMs
|
|
12368
12259
|
}),
|
|
12369
12260
|
ready = _f.ready,
|
|
12370
12261
|
modelLoadState = _f.modelLoadState,
|
|
12371
12262
|
modelDownloadProgress = _f.modelDownloadProgress,
|
|
12372
12263
|
modelWarmingStartedAt = _f.modelWarmingStartedAt,
|
|
12373
12264
|
modelError = _f.modelError;
|
|
12265
|
+
// const {
|
|
12266
|
+
// ready,
|
|
12267
|
+
// modelLoadState,
|
|
12268
|
+
// modelDownloadProgress,
|
|
12269
|
+
// modelWarmingStartedAt,
|
|
12270
|
+
// modelError,
|
|
12271
|
+
// } = useLoadFaceDetector({
|
|
12272
|
+
// onModelError,
|
|
12273
|
+
// modelLoadTimeoutMs,
|
|
12274
|
+
// videoRef,
|
|
12275
|
+
// })
|
|
12374
12276
|
var _g = useFrameLoop(useCallback(function () {
|
|
12375
12277
|
return __awaiter(_this, void 0, void 0, function () {
|
|
12376
12278
|
var vw, vh, ctx, thresholdsProvided, brightnessResults, brightness, range, variance, prediction, processed, e_1;
|
|
@@ -12384,19 +12286,21 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12384
12286
|
ctx = canvasRef.current.getContext('2d');
|
|
12385
12287
|
canvasRef.current.width = vw;
|
|
12386
12288
|
canvasRef.current.height = vh;
|
|
12387
|
-
if (!(ctx && videoRef.current.readyState === 4)) return [3 /*break*/,
|
|
12289
|
+
if (!(ctx && videoRef.current.readyState === 4)) return [3 /*break*/, 5];
|
|
12388
12290
|
ctx.translate(vw, 0);
|
|
12389
12291
|
ctx.scale(-1, 1);
|
|
12390
12292
|
ctx.drawImage(videoRef.current, 0, 0, vw, vh);
|
|
12391
12293
|
_c.label = 1;
|
|
12392
12294
|
case 1:
|
|
12393
|
-
_c.trys.push([1,
|
|
12295
|
+
_c.trys.push([1, 4,, 5]);
|
|
12394
12296
|
thresholdsProvided = minCaptureBrightnessThreshold !== undefined || minCaptureRangeThreshold !== undefined || minCaptureVarianceThreshold !== undefined;
|
|
12395
12297
|
brightnessResults = thresholdsProvided ? detectBrightnessAndContrast(canvasRef.current, addToAverage) : undefined;
|
|
12396
12298
|
brightness = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.brightness;
|
|
12397
12299
|
range = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.range;
|
|
12398
12300
|
variance = brightnessResults === null || brightnessResults === void 0 ? void 0 : brightnessResults.variance;
|
|
12399
|
-
|
|
12301
|
+
return [4 /*yield*/, makeFacePredictionWithDocumentDetector(canvasRef.current)];
|
|
12302
|
+
case 2:
|
|
12303
|
+
prediction = _c.sent();
|
|
12400
12304
|
processed = processFaceDetectorPrediction({
|
|
12401
12305
|
faces: (_a = prediction === null || prediction === void 0 ? void 0 : prediction.faces) !== null && _a !== void 0 ? _a : [],
|
|
12402
12306
|
videoWidth: vw,
|
|
@@ -12412,15 +12316,15 @@ function SelfieGuidanceModelsProvider(_a) {
|
|
|
12412
12316
|
setLastFaceDetectionAt(new Date().getTime());
|
|
12413
12317
|
// setLastPrediction(processed)
|
|
12414
12318
|
return [4 /*yield*/, (_b = onPredictionHandler.current) === null || _b === void 0 ? void 0 : _b.call(onPredictionHandler, processed)];
|
|
12415
|
-
case
|
|
12319
|
+
case 3:
|
|
12416
12320
|
// setLastPrediction(processed)
|
|
12417
12321
|
_c.sent();
|
|
12418
|
-
return [3 /*break*/,
|
|
12419
|
-
case
|
|
12322
|
+
return [3 /*break*/, 5];
|
|
12323
|
+
case 4:
|
|
12420
12324
|
e_1 = _c.sent();
|
|
12421
12325
|
error('caught face detection error', e_1);
|
|
12422
|
-
return [3 /*break*/,
|
|
12423
|
-
case
|
|
12326
|
+
return [3 /*break*/, 5];
|
|
12327
|
+
case 5:
|
|
12424
12328
|
return [2 /*return*/];
|
|
12425
12329
|
}
|
|
12426
12330
|
});
|
|
@@ -14458,7 +14362,7 @@ var useVideoSignatureStore = create()(devtools(function (set, get) {
|
|
|
14458
14362
|
_a.sent();
|
|
14459
14363
|
signatureRecorder.onstop = function () {
|
|
14460
14364
|
return __awaiter(_this, void 0, void 0, function () {
|
|
14461
|
-
var recordingStoppedAt, mimeType, blob, _a, onSignatureVideoCaptured, recordingStartRequestedAt, recordingStartedAt, firstChunkReceivedAt, signatureStartedAt, signatureEndedAt, recordingStopRequestedAt, lastChunkReceivedAt, supportsRequestVideoFrameCallback, supportsRoundRect;
|
|
14365
|
+
var recordingStoppedAt, mimeType, blob, _a, onSignatureVideoCaptured, recordingStartRequestedAt, recordingStartedAt, firstChunkReceivedAt, signatureStartedAt, signatureEndedAt, acceptClickedAt, recordingStopRequestedAt, lastChunkReceivedAt, supportsRequestVideoFrameCallback, supportsRoundRect;
|
|
14462
14366
|
return __generator(this, function (_b) {
|
|
14463
14367
|
recordingStoppedAt = performance.now();
|
|
14464
14368
|
set({
|
|
@@ -14470,7 +14374,7 @@ var useVideoSignatureStore = create()(devtools(function (set, get) {
|
|
|
14470
14374
|
});
|
|
14471
14375
|
signatureChunks = [];
|
|
14472
14376
|
signatureRecorder = null;
|
|
14473
|
-
_a = get(), onSignatureVideoCaptured = _a.onSignatureVideoCaptured, recordingStartRequestedAt = _a.recordingStartRequestedAt, recordingStartedAt = _a.recordingStartedAt, firstChunkReceivedAt = _a.firstChunkReceivedAt, signatureStartedAt = _a.signatureStartedAt, signatureEndedAt = _a.signatureEndedAt, recordingStopRequestedAt = _a.recordingStopRequestedAt, lastChunkReceivedAt = _a.lastChunkReceivedAt, supportsRequestVideoFrameCallback = _a.supportsRequestVideoFrameCallback, supportsRoundRect = _a.supportsRoundRect;
|
|
14377
|
+
_a = get(), onSignatureVideoCaptured = _a.onSignatureVideoCaptured, recordingStartRequestedAt = _a.recordingStartRequestedAt, recordingStartedAt = _a.recordingStartedAt, firstChunkReceivedAt = _a.firstChunkReceivedAt, signatureStartedAt = _a.signatureStartedAt, signatureEndedAt = _a.signatureEndedAt, acceptClickedAt = _a.acceptClickedAt, recordingStopRequestedAt = _a.recordingStopRequestedAt, lastChunkReceivedAt = _a.lastChunkReceivedAt, supportsRequestVideoFrameCallback = _a.supportsRequestVideoFrameCallback, supportsRoundRect = _a.supportsRoundRect;
|
|
14474
14378
|
onSignatureVideoCaptured(blob, signatureData !== null && signatureData !== void 0 ? signatureData : null, imageUrl !== null && imageUrl !== void 0 ? imageUrl : null, {
|
|
14475
14379
|
mimeType: mimeType,
|
|
14476
14380
|
browserFeatures: {
|
|
@@ -14483,6 +14387,7 @@ var useVideoSignatureStore = create()(devtools(function (set, get) {
|
|
|
14483
14387
|
firstChunkReceivedAt: firstChunkReceivedAt ? Math.ceil(firstChunkReceivedAt) : 0,
|
|
14484
14388
|
signatureStartedAt: signatureStartedAt ? Math.ceil(signatureStartedAt) : 0,
|
|
14485
14389
|
signatureEndedAt: signatureEndedAt ? Math.ceil(signatureEndedAt) : 0,
|
|
14390
|
+
acceptClickedAt: acceptClickedAt ? Math.ceil(acceptClickedAt) : 0,
|
|
14486
14391
|
recordingStopRequestedAt: recordingStopRequestedAt ? Math.ceil(recordingStopRequestedAt) : 0,
|
|
14487
14392
|
recordingStoppedAt: Math.ceil(recordingStoppedAt),
|
|
14488
14393
|
lastChunkReceivedAt: lastChunkReceivedAt ? Math.ceil(lastChunkReceivedAt) : 0
|
|
@@ -14513,6 +14418,7 @@ var useVideoSignatureStore = create()(devtools(function (set, get) {
|
|
|
14513
14418
|
signatureValid: false,
|
|
14514
14419
|
signatureStartedAt: undefined,
|
|
14515
14420
|
signatureEndedAt: undefined,
|
|
14421
|
+
acceptClickedAt: undefined,
|
|
14516
14422
|
supportsRequestVideoFrameCallback: undefined,
|
|
14517
14423
|
supportsRoundRect: undefined
|
|
14518
14424
|
});
|
|
@@ -14820,12 +14726,15 @@ function VideoSignatureGuides(_a) {
|
|
|
14820
14726
|
useEffect(function () {
|
|
14821
14727
|
if (guideToDisplay) setMode(guideToDisplay);
|
|
14822
14728
|
}, [guideToDisplay]);
|
|
14823
|
-
var
|
|
14824
|
-
|
|
14825
|
-
|
|
14826
|
-
|
|
14827
|
-
|
|
14828
|
-
|
|
14729
|
+
var _h = useVideoSignatureStore(useShallow(function (state) {
|
|
14730
|
+
return {
|
|
14731
|
+
firstChunkReceivedAt: state.firstChunkReceivedAt,
|
|
14732
|
+
acceptClickedAt: state.acceptClickedAt
|
|
14733
|
+
};
|
|
14734
|
+
})),
|
|
14735
|
+
firstChunkReceivedAt = _h.firstChunkReceivedAt,
|
|
14736
|
+
acceptClickedAt = _h.acceptClickedAt;
|
|
14737
|
+
var signaturePadDisabled = requestedAction !== 'CAPTURE_SIGNATURE' || !firstChunkReceivedAt || !!acceptClickedAt;
|
|
14829
14738
|
return /*#__PURE__*/React__default.createElement(Container$3, {
|
|
14830
14739
|
className: classNames.container
|
|
14831
14740
|
}, /*#__PURE__*/React__default.createElement(Inner$1, {
|
|
@@ -14952,7 +14861,8 @@ function VideoSignatureCaptureComponent(_a, ref) {
|
|
|
14952
14861
|
var rightEdge = videoWidth * (1 - headTrackingBoundaryPercentage);
|
|
14953
14862
|
var topEdge = videoHeight * headTrackingBoundaryPercentage;
|
|
14954
14863
|
var bottomEdge = videoHeight * (1 - headTrackingBoundaryPercentage);
|
|
14955
|
-
var
|
|
14864
|
+
var nose = face === null || face === void 0 ? void 0 : face.keypoints[2];
|
|
14865
|
+
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);
|
|
14956
14866
|
setLastFace(face);
|
|
14957
14867
|
setHeadTrackingSatisfied(!!face && !nearBoundary);
|
|
14958
14868
|
setNumFramesWithoutFaces(face ? 0 : function (n) {
|
|
@@ -15433,6 +15343,7 @@ function VideoSignatureWizardComponent(_a, ref) {
|
|
|
15433
15343
|
return n + 1;
|
|
15434
15344
|
});
|
|
15435
15345
|
setCaptureState(skipLivenessValidation ? 'CAPTURING_SELFIE' : 'CHECKING_LIVENESS');
|
|
15346
|
+
useVideoSignatureStore.getState().clearRecordedData();
|
|
15436
15347
|
}, [onRetryClicked, skipLivenessValidation]);
|
|
15437
15348
|
var onExitSignatureCapture = useCallback(function () {
|
|
15438
15349
|
setAttempt(function (n) {
|
|
@@ -15575,6 +15486,9 @@ function VideoSignatureWizardGuides(_a) {
|
|
|
15575
15486
|
props = __rest(_a, ["status", "restartVideoOnSignaturePadCleared", "captureAudio", "component", "showFaceGuideThenSignaturePad"]);
|
|
15576
15487
|
var Component = component !== null && component !== void 0 ? component : VideoSignatureGuides;
|
|
15577
15488
|
var onAcceptBtnClicked = useCallback(function () {
|
|
15489
|
+
useVideoSignatureStore.setState({
|
|
15490
|
+
acceptClickedAt: performance.now()
|
|
15491
|
+
});
|
|
15578
15492
|
var signaturePad = useVideoSignatureStore.getState().signaturePad;
|
|
15579
15493
|
if (!signaturePad.current) throw new Error('Signature pad not found');
|
|
15580
15494
|
var signatureData = buildSignatureData(signaturePad.current);
|
|
@@ -15897,6 +15811,16 @@ var useVideoRecorderStore = create()(devtools(function (set, get) {
|
|
|
15897
15811
|
clearRecordedData: function clearRecordedData() {
|
|
15898
15812
|
clearVideoChunks();
|
|
15899
15813
|
clearAudioChunks();
|
|
15814
|
+
set({
|
|
15815
|
+
videoUrl: null,
|
|
15816
|
+
audioUrl: null,
|
|
15817
|
+
isRecordingVideo: false,
|
|
15818
|
+
isRecordingAudio: false,
|
|
15819
|
+
videoRecordingStopped: false,
|
|
15820
|
+
audioRecordingStopped: false,
|
|
15821
|
+
videoRecordingIntentionallyStopped: false,
|
|
15822
|
+
audioRecordingIntentionallyStopped: false
|
|
15823
|
+
});
|
|
15900
15824
|
}
|
|
15901
15825
|
});
|
|
15902
15826
|
}));
|
|
@@ -16179,10 +16103,10 @@ var IdVideoCapture = function IdVideoCapture(_a) {
|
|
|
16179
16103
|
var _14 = useState(null),
|
|
16180
16104
|
videoStartsAt = _14[0],
|
|
16181
16105
|
setVideoStartsAt = _14[1];
|
|
16182
|
-
var _15 =
|
|
16106
|
+
var _15 = useSubmissionContext(),
|
|
16183
16107
|
setIdCaptureVideoAudioStartsAt = _15.setIdCaptureVideoAudioStartsAt,
|
|
16184
16108
|
setExpectedAudioText = _15.setExpectedAudioText;
|
|
16185
|
-
var _16 =
|
|
16109
|
+
var _16 = useSelfieGuidanceModelsContext(),
|
|
16186
16110
|
startSelfieGuidance = _16.start,
|
|
16187
16111
|
stopSelfieGuidance = _16.stop,
|
|
16188
16112
|
onSelfiePredictionMade = _16.onPredictionMade,
|
|
@@ -16779,6 +16703,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16779
16703
|
return n + 1;
|
|
16780
16704
|
});
|
|
16781
16705
|
setCaptureState('CAPTURING_ID');
|
|
16706
|
+
useVideoRecorderStore.getState().clearRecordedData();
|
|
16782
16707
|
}, []);
|
|
16783
16708
|
var isCapturingId = !skipIdCapture && ['LOADING', 'CAPTURING_ID'].includes(captureState);
|
|
16784
16709
|
useEffect(function () {
|
|
@@ -16813,6 +16738,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16813
16738
|
});
|
|
16814
16739
|
}, [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]);
|
|
16815
16740
|
return /*#__PURE__*/React__default.createElement(CameraStoreProvider, {
|
|
16741
|
+
key: "camera-store-".concat(attempt),
|
|
16816
16742
|
preferIphoneContinuityCamera: isCapturingId,
|
|
16817
16743
|
preferFrontFacingCamera: !isCapturingId,
|
|
16818
16744
|
requireMicrophoneAccess: !isCapturingId && !!readTextPrompt,
|
|
@@ -16824,6 +16750,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16824
16750
|
classNames: classNames === null || classNames === void 0 ? void 0 : classNames.cameraStoreProvider,
|
|
16825
16751
|
verbiage: verbiage === null || verbiage === void 0 ? void 0 : verbiage.cameraStoreProvider
|
|
16826
16752
|
}, /*#__PURE__*/React__default.createElement(IdCaptureModelsProvider, {
|
|
16753
|
+
key: "id-capture-models-".concat(attempt),
|
|
16827
16754
|
autoStart: false,
|
|
16828
16755
|
documentDetectionModelUrl: (_g = (_f = idCaptureProps.assets) === null || _f === void 0 ? void 0 : _f.documentDetectionModelUrl) !== null && _g !== void 0 ? _g : '',
|
|
16829
16756
|
focusModelUrl: (_j = (_h = idCaptureProps.assets) === null || _h === void 0 ? void 0 : _h.focusModelUrl) !== null && _j !== void 0 ? _j : '',
|
|
@@ -16831,6 +16758,7 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16831
16758
|
modelLoadTimeoutMs: idCaptureModelLoadTimeoutMs,
|
|
16832
16759
|
allowSinglePageIdCapture: idCaptureProps.allowSinglePageIdCapture
|
|
16833
16760
|
}, /*#__PURE__*/React__default.createElement(SelfieGuidanceModelsProvider, {
|
|
16761
|
+
key: "selfie-guidance-models-".concat(attempt),
|
|
16834
16762
|
autoStart: false,
|
|
16835
16763
|
onModelError: faceLivenessProps === null || faceLivenessProps === void 0 ? void 0 : faceLivenessProps.onModelError,
|
|
16836
16764
|
modelLoadTimeoutMs: faceLivenessProps === null || faceLivenessProps === void 0 ? void 0 : faceLivenessProps.modelLoadTimeoutMs,
|
|
@@ -16840,7 +16768,9 @@ var VideoIdWizard = function VideoIdWizard(_a) {
|
|
|
16840
16768
|
})), function () {
|
|
16841
16769
|
switch (captureState) {
|
|
16842
16770
|
case 'CAPTURING_ID':
|
|
16843
|
-
return /*#__PURE__*/React__default.createElement(IdCaptureStateProvider,
|
|
16771
|
+
return /*#__PURE__*/React__default.createElement(IdCaptureStateProvider, {
|
|
16772
|
+
key: "id-capture-state-".concat(attempt)
|
|
16773
|
+
}, /*#__PURE__*/React__default.createElement(GuideOrientationContextProvider, null, /*#__PURE__*/React__default.createElement(IdCaptureWizard, _assign({
|
|
16844
16774
|
key: "id-capture-".concat(attempt),
|
|
16845
16775
|
loadingOverlayMode: idCaptureLoadingOverlayMode,
|
|
16846
16776
|
customOverlayContent: customOverlayContent,
|