@incodetech/core 2.1.0-rc.2 → 2.1.0-rc.3
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/3dAvatarProvider-ChciZmjE.esm.js +28214 -0
- package/dist/{BrowserStorageProvider-D5xc7Lqo.esm.js → BrowserStorageProvider-CrrN540a.esm.js} +1 -25
- package/dist/BrowserVisibilityObserverProvider-rim9Jrz-.esm.js +25 -0
- package/dist/Face2DProvider-BeLlYBbB.esm.js +824 -0
- package/dist/FaceDetectionProvider-B78455D4.d.ts +119 -0
- package/dist/IVisibilityObserverCapability-BbWjgpiF.d.ts +12 -0
- package/dist/IWasmUtilCapability-d2XvzaCk.d.ts +145 -0
- package/dist/IpifyProvider-BRW14_uo.esm.js +51 -0
- package/dist/{Manager-B2OEDYqf.d.ts → Manager-CJ3G2zqi.d.ts} +1 -4
- package/dist/{OpenViduRecordingProvider-DF7A4ZNJ.esm.js → OpenViduRecordingProvider-B_0GKkzc.esm.js} +1 -1
- package/dist/PrivacyLensProvider-hDzaDzZ6.esm.js +339 -0
- package/dist/StateMachine-C_AY4cs7.d.ts +2 -0
- package/dist/{StreamCanvasCapture-Dr5n_iK1.esm.js → StreamCanvasCapture-Bz17q4FP.esm.js} +1 -1
- package/dist/StreamCanvasCapture-DS1TOoiH.d.ts +42 -0
- package/dist/{WasmUtilProvider-CIu373BZ.esm.js → WasmUtilProvider-ADG54T6M.esm.js} +16 -1
- package/dist/{addressSearch-BH96a3fq.esm.js → addressSearch-DJyNTg5S.esm.js} +4 -4
- package/dist/{ae-signature-CDEN8y-w.esm.js → ae-signature-DlElqFrZ.esm.js} +1 -1
- package/dist/ae-signature.d.ts +4 -3
- package/dist/ae-signature.esm.js +10 -9
- package/dist/antifraud.d.ts +4 -3
- package/dist/antifraud.esm.js +7 -6
- package/dist/{antifraudManager-DZifA5zX.esm.js → antifraudManager-BKdQoMFf.esm.js} +4 -3
- package/dist/{antifraudManager-B7WQTIdu.d.ts → antifraudManager-DpIvbrZP.d.ts} +2 -2
- package/dist/{antifraudStateMachine-DlKrK2hL.esm.js → antifraudStateMachine-C0NGnP9W.esm.js} +3 -3
- package/dist/{api-DUZwyz0o.esm.js → api-DsbUi7TO.esm.js} +21 -2
- package/dist/authentication.d.ts +19 -12
- package/dist/authentication.esm.js +33 -27
- package/dist/{authenticationManager-Dve7mGLe.d.ts → authenticationManager-CdPbNS2H.d.ts} +3 -3
- package/dist/{authenticationManager-BM4LzyV7.esm.js → authenticationManager-Dtl1vcET.esm.js} +6 -6
- package/dist/{authenticationStateMachine-Chx3ySdT.esm.js → authenticationStateMachine-D-hOlg8p.esm.js} +8 -8
- package/dist/avatar.d.ts +3 -0
- package/dist/avatar.esm.js +3 -0
- package/dist/{backCameraStream-iftkf3rd.esm.js → backCameraStream-ZyqrFyjO.esm.js} +3 -3
- package/dist/{browser-DlFgHpoC-7tbRR1aR.esm.js → browser-DlFgHpoC-qLKs75Qp.esm.js} +1 -1
- package/dist/{browserSimulation-CGjpdNA1.esm.js → browserSimulation-TsSoavQv.esm.js} +153 -1216
- package/dist/camera-DUkgmYMo.esm.js +79 -0
- package/dist/camera.d.ts +7 -1
- package/dist/camera.esm.js +4 -4
- package/dist/{StreamCanvasCapture-Ctgyx-oD.d.ts → canvas-CJUmoXSD.d.ts} +1 -41
- package/dist/certificate-issuance.d.ts +31 -30
- package/dist/certificate-issuance.esm.js +8 -7
- package/dist/{certificateIssuanceStateMachine-CLNXtXaC.esm.js → certificateIssuanceStateMachine-C07m7qtP.esm.js} +4 -4
- package/dist/clientLifecycle-Ct7h9uxx.esm.js +534 -0
- package/dist/consent.d.ts +4 -3
- package/dist/consent.esm.js +7 -6
- package/dist/{consentManager-psDCeJ0E.esm.js → consentManager-BtnPZUW4.esm.js} +4 -3
- package/dist/{consentManager-BqUGU_YD.d.ts → consentManager-DufVo9D9.d.ts} +52 -52
- package/dist/{consentStateMachine-DRsFFSHE.esm.js → consentStateMachine-DO2JqoZW.esm.js} +3 -3
- package/dist/cpf-ocr.d.ts +4 -3
- package/dist/cpf-ocr.esm.js +7 -6
- package/dist/{cpfOcrManager-BxcgxvgO.esm.js → cpfOcrManager-C4rLgKsu.esm.js} +6 -5
- package/dist/{cpfOcrManager-B2u9hMzd.d.ts → cpfOcrManager-DqZZ94Gt.d.ts} +19 -19
- package/dist/createFaceAvatar-B8pFpy6o.d.ts +401 -0
- package/dist/createFaceAvatar-BOHDKQRq.esm.js +46 -0
- package/dist/cross-document-data-match.d.ts +2 -1
- package/dist/cross-document-data-match.esm.js +6 -5
- package/dist/curp-validation.d.ts +10 -7
- package/dist/curp-validation.esm.js +7 -6
- package/dist/{curpValidationManager-BgLDw0Ub.esm.js → curpValidationManager-BafobPXC.esm.js} +4 -3
- package/dist/{curpValidationManager-Bt6CVD8b.d.ts → curpValidationManager-Co6LZAHT.d.ts} +3 -3
- package/dist/{curpValidationStateMachine-BK_wJ48C.esm.js → curpValidationStateMachine-DXTPK6vI.esm.js} +3 -3
- package/dist/custom-fields.d.ts +3 -2
- package/dist/custom-fields.esm.js +6 -5
- package/dist/custom-watchlist.d.ts +2 -1
- package/dist/custom-watchlist.esm.js +6 -5
- package/dist/{customWatchlistStateMachine-Bi4P59HM.esm.js → customWatchlistStateMachine-B4G3Chkx.esm.js} +3 -3
- package/dist/{deepsightLoader-BMmvk0X6.esm.js → deepsightLoader-DHSVD776.esm.js} +14 -13
- package/dist/{deepsightService-CEZrdiW0.esm.js → deepsightService-CDahSjGP.esm.js} +9 -38
- package/dist/deepsightService-CMB9XjES.d.ts +69 -0
- package/dist/device.d.ts +9 -1
- package/dist/device.esm.js +5 -5
- package/dist/document-capture.d.ts +175 -174
- package/dist/document-capture.esm.js +14 -13
- package/dist/document-upload.d.ts +48 -47
- package/dist/document-upload.esm.js +9 -8
- package/dist/{documentCaptureStateMachine-MpwpJO7t.esm.js → documentCaptureStateMachine-DSOX2epf.esm.js} +7 -7
- package/dist/dynamic-forms.d.ts +4 -192
- package/dist/dynamic-forms.esm.js +8 -160
- package/dist/dynamicFormsManager-BOefZbyF.esm.js +168 -0
- package/dist/dynamicFormsManager-CUYLOj9g.d.ts +239 -0
- package/dist/{dynamicFormsStateMachine-Do84A4uU.esm.js → dynamicFormsStateMachine-BXHcaocI.esm.js} +4 -4
- package/dist/ekyb.d.ts +9 -6
- package/dist/ekyb.esm.js +20 -17
- package/dist/{ekybStateMachine-nsuPOw3f.esm.js → ekybStateMachine-CCSeqjCt.esm.js} +5 -5
- package/dist/ekyc.d.ts +4 -3
- package/dist/ekyc.esm.js +9 -8
- package/dist/{ekycStateMachine-DcynX0rj.esm.js → ekycStateMachine-DkLVTOyA.esm.js} +5 -5
- package/dist/electronic-signature.d.ts +4 -3
- package/dist/electronic-signature.esm.js +9 -8
- package/dist/{electronicSignatureManager-B63aAuI5.esm.js → electronicSignatureManager-DjzUzqZj.esm.js} +50 -87
- package/dist/email.d.ts +5 -4
- package/dist/email.esm.js +9 -8
- package/dist/{emailManager-DxHjAe5u.esm.js → emailManager-B_XzEsXH.esm.js} +5 -4
- package/dist/{emailManager-C6D2u4mQ.d.ts → emailManager-fHASH6uo.d.ts} +3 -3
- package/dist/{emailStateMachine-758f34gg.esm.js → emailStateMachine-fqJ42b19.esm.js} +5 -5
- package/dist/{endpoints-BM2_j_IE.esm.js → endpoints-BzMJFAPV.esm.js} +13 -0
- package/dist/{events-DN-u67gb.esm.js → events-CqGY1yMq.esm.js} +2 -188
- package/dist/events.d.ts +2 -0
- package/dist/events.esm.js +3 -2
- package/dist/extensibility.d.ts +37 -26
- package/dist/extensibility.esm.js +74 -59
- package/dist/{externalFetch-crimxkN9.esm.js → externalFetch-CyhBfD-n.esm.js} +1 -1
- package/dist/face-match.d.ts +2 -2
- package/dist/face-match.esm.js +6 -5
- package/dist/{faceCaptureManagerFactory-BNXZchWX.esm.js → faceCaptureManagerFactory-2brKTzMb.esm.js} +25 -16
- package/dist/faceCaptureManagerFactory-CGKbf7zt.d.ts +400 -0
- package/dist/{faceCaptureSetup-Dqb09D24.esm.js → faceCaptureSetup-CDUVU1nl.esm.js} +97 -13
- package/dist/{faceMatchStateMachine-FikRaUZH.esm.js → faceMatchStateMachine-DUeUjEPx.esm.js} +3 -3
- package/dist/field-comparison.d.ts +4 -3
- package/dist/field-comparison.esm.js +6 -5
- package/dist/{fieldComparisonManager-Dic0DVgl.esm.js → fieldComparisonManager-B9W0a9A5.esm.js} +5 -4
- package/dist/{fieldComparisonManager-BXc6-DJv.d.ts → fieldComparisonManager-DdLqDeB2.d.ts} +2 -2
- package/dist/fiscal-qr.d.ts +5 -3
- package/dist/fiscal-qr.esm.js +13 -12
- package/dist/flow-events.d.ts +8 -6
- package/dist/flow.d.ts +21 -13
- package/dist/flow.esm.js +28 -19
- package/dist/{flowCompletionService-CdGDKv0z.d.ts → flowCompletionService-BIqSTZcd.d.ts} +2 -1
- package/dist/{flowCompletionService-D_CsiDZM.esm.js → flowCompletionService-qEqh_g14.esm.js} +3 -3
- package/dist/{flowServices-ar5DXv71.esm.js → flowServices-C4piblgx.esm.js} +24 -9
- package/dist/geolocation.d.ts +4 -127
- package/dist/geolocation.esm.js +8 -115
- package/dist/geolocationManager-BP2Do9O-.esm.js +123 -0
- package/dist/geolocationManager-Cs50eRlC.d.ts +156 -0
- package/dist/{geolocationStateMachine-BWjrMGS_.esm.js → geolocationStateMachine-BYfOOOG0.esm.js} +4 -4
- package/dist/{getDeviceClass-rXKlXywy.esm.js → getDeviceClass-DGGzzfqm.esm.js} +1 -1
- package/dist/getDeviceData-TrKM8NPh.esm.js +101 -0
- package/dist/government-validation.d.ts +4 -3
- package/dist/government-validation.esm.js +8 -7
- package/dist/{governmentValidationStateMachine-BoF7U1of.esm.js → governmentValidationStateMachine-CwoPPO8b.esm.js} +5 -5
- package/dist/home.d.ts +18 -15
- package/dist/home.esm.js +4 -3
- package/dist/http.esm.js +2 -2
- package/dist/id-ocr.d.ts +4 -625
- package/dist/id-ocr.esm.js +8 -84
- package/dist/id-verification.d.ts +28 -27
- package/dist/id-verification.esm.js +6 -5
- package/dist/id.d.ts +16 -11
- package/dist/id.esm.js +39 -32
- package/dist/idCaptureDefaults-DNJON8Xo.esm.js +188 -0
- package/dist/{idCaptureManager-BvGUSN2e.d.ts → idCaptureManager-BVdvfJys.d.ts} +40 -10
- package/dist/{idCaptureManager-Bm6Wm6Qv.esm.js → idCaptureManager-Bo9DCQSU.esm.js} +14 -11
- package/dist/{idCaptureStateMachine-D1YhOj6n.esm.js → idCaptureStateMachine-BeDidMLU.esm.js} +395 -382
- package/dist/idOcrManager-BkRDrpZu.esm.js +92 -0
- package/dist/idOcrManager-CJzrmM91.d.ts +641 -0
- package/dist/{idOcrStateMachine-YMCDGplq.esm.js → idOcrStateMachine-DRZc4FBl.esm.js} +5 -5
- package/dist/{idVerificationStateMachine-Bo1IYuZH.esm.js → idVerificationStateMachine-oqiERKpg.esm.js} +3 -3
- package/dist/identity-reuse.d.ts +4 -3
- package/dist/identity-reuse.esm.js +7 -6
- package/dist/{identityReuseManager-D0knIrOy.esm.js → identityReuseManager-Bu62LToE.esm.js} +4 -3
- package/dist/{identityReuseManager-DcWSvC-A.d.ts → identityReuseManager-TWKbXuvY.d.ts} +33 -33
- package/dist/{identityReuseStateMachine-CSQfZOqD.esm.js → identityReuseStateMachine-BmONeF6B.esm.js} +3 -3
- package/dist/{index-BgxYUYuD.d.ts → index-DtUlD-bz.d.ts} +2 -2
- package/dist/{index-DV134v62.d.ts → index-Icld-cKW.d.ts} +175 -295
- package/dist/index.d.ts +3 -3
- package/dist/index.esm.js +16 -13
- package/dist/{invokeOnCaptureCallback-Dzemudhk.esm.js → invokeOnCaptureCallback-v_PV_IJz.esm.js} +1 -1
- package/dist/{lib-7ZQ9BdKH.esm.js → lib-B050WTth.esm.js} +1 -1
- package/dist/mandatory-consent.d.ts +10 -7
- package/dist/mandatory-consent.esm.js +7 -6
- package/dist/{mandatoryConsentManager-Tzl5Qd35.d.ts → mandatoryConsentManager-Bmdjo14S.d.ts} +50 -50
- package/dist/{mandatoryConsentManager-Lon46nPQ.esm.js → mandatoryConsentManager-CQ3jirlZ.esm.js} +4 -3
- package/dist/{mandatoryConsentStateMachine-D_dZ7IF6.esm.js → mandatoryConsentStateMachine-DkJJLHqC.esm.js} +3 -3
- package/dist/mediaRecorderOptions-C3NAkVgK.esm.js +42 -0
- package/dist/mediapipeShared-CRAKVElv.esm.js +67 -0
- package/dist/{recordingService-CxMJP4tQ.esm.js → onDeviceFaceResults-DVBggeq8.esm.js} +71 -389
- package/dist/{openviduLazy-oAXXI9w_.esm.js → openviduLazy-BTOIauGP.esm.js} +2 -2
- package/dist/openviduLazy-Dov8oKfL.esm.js +3 -0
- package/dist/{permissionGuards-D-Z-lgNj.esm.js → permissionGuards-BR2oN573.esm.js} +1 -1
- package/dist/{permissionServices-CPDboRoE.esm.js → permissionServices-BJhGL13R.esm.js} +7 -4
- package/dist/personhood.d.ts +534 -0
- package/dist/personhood.esm.js +1494 -0
- package/dist/phone.d.ts +5 -4
- package/dist/phone.esm.js +9 -8
- package/dist/{phoneManager-TSq1Ief6.d.ts → phoneManager-BOTcjXgs.d.ts} +3 -3
- package/dist/{phoneManager-Blt4Oc2P.esm.js → phoneManager-BWlxqbyD.esm.js} +5 -4
- package/dist/{phoneStateMachine-W3c6Z8sj.esm.js → phoneStateMachine-B_V9nODs.esm.js} +5 -5
- package/dist/{qe-signature-CQLK6LKE.esm.js → qe-signature-BhFnI9pT.esm.js} +1 -1
- package/dist/qe-signature.d.ts +4 -3
- package/dist/qe-signature.esm.js +10 -9
- package/dist/recordingService-m_1xCthr.esm.js +347 -0
- package/dist/redirect-to-mobile.d.ts +4 -3
- package/dist/redirect-to-mobile.esm.js +9 -8
- package/dist/{redirectToMobileManager-DCvpKdkD.esm.js → redirectToMobileManager-BaAo9rgi.esm.js} +5 -4
- package/dist/{redirectToMobileManager-yOHAmwg-.d.ts → redirectToMobileManager-Br0KZK1G.d.ts} +2 -2
- package/dist/{redirectToMobileStateMachine-DC9z4Vfu.esm.js → redirectToMobileStateMachine-DoAnf2ql.esm.js} +10 -12
- package/dist/{runChildModule-C9G0wfVC.esm.js → runChildModule-0nQfjVVo.esm.js} +3 -3
- package/dist/selfie.d.ts +19 -12
- package/dist/selfie.esm.js +34 -28
- package/dist/{selfieManager-BRL6c_Oc.esm.js → selfieManager-D_ZFERsE.esm.js} +6 -6
- package/dist/{selfieManager-imY2dAcH.d.ts → selfieManager-R0Jw5sjb.d.ts} +3 -3
- package/dist/{selfieStateMachine-D2Q0uwDK.esm.js → selfieStateMachine-CIgeeiN9.esm.js} +4 -4
- package/dist/{session-Be_IA1e0.esm.js → session-9jIfKFCc.esm.js} +3 -3
- package/dist/session.d.ts +7 -5
- package/dist/session.esm.js +16 -14
- package/dist/{sessionInitializer-CaiGA8GP.esm.js → sessionInitializer-C_TYIgyk.esm.js} +11 -107
- package/dist/{setup-BJZAkajt.d.ts → setup-CpRnXxn8.d.ts} +16 -3
- package/dist/setup-DHc6OaHm.esm.js +562 -0
- package/dist/signature.d.ts +3 -2
- package/dist/signature.esm.js +6 -5
- package/dist/{signatureStateMachine-DAxXmMrk.esm.js → signatureStateMachine-DtoiPzys.esm.js} +3 -3
- package/dist/{stats-DntyIiGr.esm.js → stats-CYcScXcO.esm.js} +2 -2
- package/dist/stats.esm.js +3 -3
- package/dist/thumbmarkAdapter-fHBUDlAP.esm.js +1194 -0
- package/dist/{tri-CtxWthxz.esm.js → tri-BG1iJsr4.esm.js} +12 -2
- package/dist/tri.d.ts +1 -1
- package/dist/{tri.esm-CrWAulDi.esm.js → tri.esm-DUC01NgO.esm.js} +27 -23
- package/dist/tri.esm.js +2 -2
- package/dist/trust-graph.d.ts +4 -3
- package/dist/trust-graph.esm.js +4 -3
- package/dist/{types-DpTWgfKY.d.ts → types-BklZ_Wne.d.ts} +1 -1
- package/dist/{types-Dv-9WPJX.d.ts → types-BsYXnC5s.d.ts} +39 -3
- package/dist/types-CxW2e0Ar.d.ts +132 -0
- package/dist/{types-Z9wv19v2.d.ts → types-DgGlgyZT.d.ts} +1 -1
- package/dist/types-ElOJAGaM.esm.js +189 -0
- package/dist/video-C2WIj6TS.esm.js +36 -0
- package/dist/video-selfie.d.ts +351 -0
- package/dist/video-selfie.esm.js +1509 -0
- package/dist/videoSelfieSteps-7M5vxKn-.esm.js +58 -0
- package/dist/{warmup--6HA3yUR.d.ts → warmup-BJZPQIiX.d.ts} +5 -1
- package/dist/wasm.d.ts +4 -4
- package/dist/wasm.esm.js +17 -14
- package/dist/watchlist-for-business.d.ts +2 -1
- package/dist/watchlist-for-business.esm.js +6 -5
- package/dist/watchlist.d.ts +2 -1
- package/dist/watchlist.esm.js +6 -5
- package/dist/{watchlistForBusinessStateMachine-DtefJb-D.esm.js → watchlistForBusinessStateMachine-DvEunDxs.esm.js} +3 -3
- package/dist/{watchlistStateMachine-B0aIS2_n.esm.js → watchlistStateMachine-AHXVf-TB.esm.js} +3 -3
- package/dist/workflow.d.ts +230 -98
- package/dist/workflow.esm.js +123 -79
- package/dist/{xstate.esm-Dkm1jy5u.esm.js → xstate.esm-Bomq1a0z.esm.js} +41 -1
- package/package.json +16 -1
- package/dist/IpifyProvider-oZf7Ke1O.esm.js +0 -167
- package/dist/camera-x4LjGTjZ.esm.js +0 -22
- package/dist/deepsightService-ByNKY5Jv.d.ts +0 -276
- package/dist/faceCaptureManagerFactory-CL-7T_vH.d.ts +0 -731
- package/dist/getBrowser-Dv8LZyHE.esm.js +0 -8
- package/dist/openviduLazy-B_s6jnEk.esm.js +0 -3
- package/dist/setup-C7tintPc.esm.js +0 -1064
- /package/dist/{Actor-fIPLXfoi.d.ts → Actor-CGEelYtQ.d.ts} +0 -0
- /package/dist/{BrowserTimerProvider-BVgutW_b.esm.js → BrowserTimerProvider-CHloo0eQ.esm.js} +0 -0
- /package/dist/{ITimerCapability-BvH0pDwp.esm.js → ITimerCapability-pltuG1E8.esm.js} +0 -0
- /package/dist/{MotionSensorProvider-C9fPAJdS.esm.js → MotionSensorProvider-DCbId4De.esm.js} +0 -0
- /package/dist/{apiError-D-GTvFrH.esm.js → apiError-DNS2OCEX.esm.js} +0 -0
- /package/dist/{camera-biGPWlmx.d.ts → camera-CNVUo-bC.d.ts} +0 -0
- /package/dist/{canvas-7uX2izHb.esm.js → canvas-_I95hkPg.esm.js} +0 -0
- /package/dist/{chunk-BK1xu56N.esm.js → chunk-CIKcdghV.esm.js} +0 -0
- /package/dist/{cpf-xBg-DFNn.esm.js → cpf-BKaho0j_.esm.js} +0 -0
- /package/dist/{dateUtils-8dCcuArE.esm.js → dateUtils-7-tQYRNN.esm.js} +0 -0
- /package/dist/{getDeviceClass-C0zrM97a.esm.js → getDeviceClass-DavNdcxh.esm.js} +0 -0
- /package/dist/{http-CfVTgMfU.esm.js → http-BkiUT7EB.esm.js} +0 -0
- /package/dist/{index-52_qi4bd.d.ts → index-XTtxaahe.d.ts} +0 -0
- /package/dist/{otp-D87RTwrx.esm.js → otp-Bfnzf7I3.esm.js} +0 -0
- /package/dist/{otp-BHJnjEEc.d.ts → otp-M4iy57XY.d.ts} +0 -0
- /package/dist/{platform-BfoqeM61.esm.js → platform-uIVQUnJP.esm.js} +0 -0
- /package/dist/{types-BdVOWGGW.esm.js → types-CMcxlSmH.esm.js} +0 -0
- /package/dist/{types-DYZja-k9.d.ts → types-D_IceWxT.d.ts} +0 -0
- /package/dist/{types-F0IXbaCB.d.ts → types-Duy2rDxF.d.ts} +0 -0
- /package/dist/{urlUtils-8RNHyW3x.esm.js → urlUtils-BZqFU9rR.esm.js} +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { n as WasmPipeline } from "./warmup-BJZPQIiX.js";
|
|
2
|
+
import { c as FaceAttributesThresholds, d as FaceDetectionCallbacks, f as FaceDetectionConfig, h as IFaceDetectionCapability, l as FaceChecksConfig, m as FacePositionConstraints, p as FaceDetectionThresholds, v as WebApiHostRequestConfig } from "./createFaceAvatar-B8pFpy6o.js";
|
|
3
|
+
|
|
4
|
+
//#region ../infra/src/wasm/WasmPipelineType.d.ts
|
|
5
|
+
declare enum WasmPipelineType {
|
|
6
|
+
IdBlurGlarePipeline = 0,
|
|
7
|
+
IdBarcodeAndTextQualityPipeline = 1,
|
|
8
|
+
IdVideoSelfiePipeline = 2,
|
|
9
|
+
SelfieWithAggregationMetrics = 3,
|
|
10
|
+
SelfieWithQualityMetrics = 4,
|
|
11
|
+
OnDeviceSelfieWorkflow = 5,
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region ../infra/src/providers/wasm/BaseWasmProvider.d.ts
|
|
15
|
+
/**
|
|
16
|
+
* Base configuration for WASM providers
|
|
17
|
+
*/
|
|
18
|
+
interface BaseWasmConfig {
|
|
19
|
+
/** Path to the WASM binary */
|
|
20
|
+
wasmPath?: string;
|
|
21
|
+
/** Path to the SIMD-optimized WASM binary (optional) */
|
|
22
|
+
wasmSimdPath?: string;
|
|
23
|
+
/** Path to the WASM glue code (paired with `wasmPath`) */
|
|
24
|
+
glueCodePath?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Path to the SIMD-optimized WASM glue code (paired with `wasmSimdPath`).
|
|
27
|
+
* If omitted, defaults to a sibling `.js` derived from `wasmSimdPath`.
|
|
28
|
+
*/
|
|
29
|
+
glueCodeSimdPath?: string;
|
|
30
|
+
/** Whether to use SIMD optimizations (default: true) */
|
|
31
|
+
useSimd?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Base path for ML model files. Models will be loaded from `${modelsBasePath}/${modelFileName}`.
|
|
34
|
+
* If not provided, models are expected in a 'models' subdirectory relative to the WASM binary.
|
|
35
|
+
*/
|
|
36
|
+
modelsBasePath?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Base provider class that abstracts common WASM functionality.
|
|
40
|
+
* This serves as a foundation for specific ML capability providers
|
|
41
|
+
* like FaceDetectionProvider and IdCaptureProvider.
|
|
42
|
+
*/
|
|
43
|
+
declare abstract class BaseWasmProvider {
|
|
44
|
+
private _isInitialized;
|
|
45
|
+
protected pipelineType: WasmPipelineType | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Creates a new BaseWasmProvider
|
|
48
|
+
* @param pipelineType - The WASM pipeline type this provider uses
|
|
49
|
+
*/
|
|
50
|
+
constructor(pipelineType?: WasmPipelineType);
|
|
51
|
+
/**
|
|
52
|
+
* Returns whether this provider has been initialized.
|
|
53
|
+
*/
|
|
54
|
+
get initialized(): boolean;
|
|
55
|
+
protected getPipelineType(): WasmPipelineType;
|
|
56
|
+
/**
|
|
57
|
+
* Initializes the provider by ensuring WASM is loaded
|
|
58
|
+
* @param config - Provider configuration
|
|
59
|
+
* @param pipeline - The pipeline type to warm up ('selfie', 'idCapture', etc.)
|
|
60
|
+
*/
|
|
61
|
+
protected initializeBase(config: BaseWasmConfig, pipeline: WasmPipeline): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Ensures the provider is initialized before performing operations.
|
|
64
|
+
* @throws Error if not initialized
|
|
65
|
+
*/
|
|
66
|
+
protected ensureInitialized(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Processes a frame through the WASM pipeline
|
|
69
|
+
* @param image - Image data to process
|
|
70
|
+
* @returns The pipeline result (type depends on pipeline - WASM returns any)
|
|
71
|
+
*/
|
|
72
|
+
protected processFrameWasm(image: ImageData): Promise<any>;
|
|
73
|
+
abstract processFrame(image: ImageData): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Resets the pipeline to its initial state.
|
|
76
|
+
* Safe to call even if not initialized (no-op in that case).
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Disposes of resources and resets initialization state.
|
|
81
|
+
* Safe to call even if not initialized.
|
|
82
|
+
*/
|
|
83
|
+
dispose(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region ../infra/src/providers/wasm/FaceDetectionProvider.d.ts
|
|
87
|
+
declare class FaceDetectionProvider extends BaseWasmProvider implements IFaceDetectionCapability {
|
|
88
|
+
private defaultThresholds;
|
|
89
|
+
private currentThresholds;
|
|
90
|
+
private currentFrame;
|
|
91
|
+
private onFaceDataCallback;
|
|
92
|
+
constructor();
|
|
93
|
+
processFrame(image: ImageData): Promise<void>;
|
|
94
|
+
initialize(config: FaceDetectionConfig): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Last-registered onCapture callback — captured into a private
|
|
97
|
+
* field so `forceCapture()` (called from outside the WASM-callback
|
|
98
|
+
* lifecycle) can re-fire the same wrapper. `setCallbacks` rebinds
|
|
99
|
+
* this on each invocation, so the field always reflects the
|
|
100
|
+
* current consumer.
|
|
101
|
+
*/
|
|
102
|
+
private currentOnCaptureWrapper;
|
|
103
|
+
processPhoto(canvas: HTMLCanvasElement): void;
|
|
104
|
+
postFaceResults(config?: WebApiHostRequestConfig): Promise<unknown>;
|
|
105
|
+
setCallbacks(callbacks: FaceDetectionCallbacks): void;
|
|
106
|
+
setPositionConstraints(constraints: FacePositionConstraints): void;
|
|
107
|
+
applyDefaults(autocaptureInterval?: number): void;
|
|
108
|
+
setAutocaptureInterval(interval: number): void;
|
|
109
|
+
setThresholds(thresholds: FaceDetectionThresholds): void;
|
|
110
|
+
setAttributesThresholds(thresholds: FaceAttributesThresholds): void;
|
|
111
|
+
setChecksEnabled(config: FaceChecksConfig): void;
|
|
112
|
+
setVideoSelfieMode(enabled: boolean): void;
|
|
113
|
+
forceCapture(): void;
|
|
114
|
+
reset(): void;
|
|
115
|
+
private createDefaultFaceCoordinates;
|
|
116
|
+
private formatFaceCoordinates;
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
export { BaseWasmProvider as n, FaceDetectionProvider as t };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region ../infra/src/capabilities/IVisibilityObserverCapability.d.ts
|
|
2
|
+
type IVisibilityObserverCapability = {
|
|
3
|
+
/**
|
|
4
|
+
* Whether the document is currently visible. Lets the orchestrator seed its
|
|
5
|
+
* dedupe state and emit an initial `background` when a session starts while
|
|
6
|
+
* the tab is already hidden (e.g. the SDK is opened in a background tab).
|
|
7
|
+
*/
|
|
8
|
+
isVisible(): boolean;
|
|
9
|
+
onVisibilityChange(listener: (visible: boolean) => void): () => void;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { IVisibilityObserverCapability as t };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { n as WasmPipeline } from "./warmup-BJZPQIiX.js";
|
|
2
|
+
import { _ as MLProviderConfig } from "./createFaceAvatar-B8pFpy6o.js";
|
|
3
|
+
|
|
4
|
+
//#region ../infra/src/capabilities/IRecordingCapability.d.ts
|
|
5
|
+
type RecordingPublisher = {
|
|
6
|
+
getStreamId: () => string | undefined;
|
|
7
|
+
replaceVideoTrack: (track: MediaStreamTrack) => Promise<void>;
|
|
8
|
+
destroy: () => void;
|
|
9
|
+
};
|
|
10
|
+
type RecordingConnection = {
|
|
11
|
+
sessionId: string | undefined;
|
|
12
|
+
publisher: RecordingPublisher;
|
|
13
|
+
disconnect: () => Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
type RecordingConnectionEvents = {
|
|
16
|
+
onSessionConnected?: (sessionId: string | undefined) => void;
|
|
17
|
+
onSessionDisconnected?: (sessionId: string | undefined) => void;
|
|
18
|
+
onSessionException?: (params: {
|
|
19
|
+
name?: string;
|
|
20
|
+
message?: string;
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
}) => void;
|
|
23
|
+
onPublisherCreated?: (params: {
|
|
24
|
+
streamId?: string;
|
|
25
|
+
sessionId?: string;
|
|
26
|
+
}) => void;
|
|
27
|
+
onPublisherError?: (params: {
|
|
28
|
+
message?: string;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
streamId?: string;
|
|
31
|
+
}) => void;
|
|
32
|
+
};
|
|
33
|
+
type ConnectRecordingParams = {
|
|
34
|
+
sessionToken: string;
|
|
35
|
+
stream: MediaStream;
|
|
36
|
+
events?: RecordingConnectionEvents;
|
|
37
|
+
};
|
|
38
|
+
type IRecordingCapability = {
|
|
39
|
+
/**
|
|
40
|
+
* Connects to a recording session and publishes the provided media stream.
|
|
41
|
+
* Returns a connection handle that can be disconnected and used to manage the publisher.
|
|
42
|
+
*/
|
|
43
|
+
connect: (params: ConnectRecordingParams) => Promise<RecordingConnection>;
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region ../infra/src/capabilities/IStorageCapability.d.ts
|
|
47
|
+
/**
|
|
48
|
+
* Storage capability interface for abstracting storage operations.
|
|
49
|
+
* Enables swapping between browser localStorage and future WASM-based storage.
|
|
50
|
+
*/
|
|
51
|
+
interface IStorageCapability {
|
|
52
|
+
/**
|
|
53
|
+
* Retrieves a value from storage.
|
|
54
|
+
* @param key - The storage key
|
|
55
|
+
* @returns The stored value or null if not found
|
|
56
|
+
*/
|
|
57
|
+
get<T>(key: string): Promise<T | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Stores a value in storage.
|
|
60
|
+
* @param key - The storage key
|
|
61
|
+
* @param value - The value to store (will be serialized)
|
|
62
|
+
*/
|
|
63
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Removes a value from storage.
|
|
66
|
+
* @param key - The storage key to remove
|
|
67
|
+
*/
|
|
68
|
+
remove(key: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Clears all values from storage.
|
|
71
|
+
*/
|
|
72
|
+
clear(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
//#region ../infra/src/capabilities/IWasmUtilCapability.d.ts
|
|
76
|
+
type WasmUtilConfig = MLProviderConfig & {
|
|
77
|
+
pipelines?: WasmPipeline[];
|
|
78
|
+
};
|
|
79
|
+
type VirtualCameraCheckOutput = {
|
|
80
|
+
canvas: HTMLCanvasElement | null;
|
|
81
|
+
itr: boolean | null;
|
|
82
|
+
skipped: boolean | null;
|
|
83
|
+
};
|
|
84
|
+
type IWasmUtilCapability = {
|
|
85
|
+
/**
|
|
86
|
+
* Whether the provider has been initialized and is ready to be used.
|
|
87
|
+
*/
|
|
88
|
+
readonly initialized: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Initializes the provider with the given configuration.
|
|
91
|
+
* If WASM was already warmed up via `warmupWasm()`, this returns almost instantly.
|
|
92
|
+
* @param config - Provider configuration including WASM paths
|
|
93
|
+
*/
|
|
94
|
+
initialize(config: WasmUtilConfig): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Encrypts a base64 image using the WASM utility API.
|
|
97
|
+
* @param image - Base64 image string (no data URL prefix)
|
|
98
|
+
* @returns Encrypted string
|
|
99
|
+
*/
|
|
100
|
+
encryptImage(image: string): string;
|
|
101
|
+
setSdkVersion(version: string): void;
|
|
102
|
+
setSdkPlatform(platform: string): void;
|
|
103
|
+
setDeviceInfo(deviceInfo: object, overrideExisting?: boolean): void;
|
|
104
|
+
setBrowserInfo(browserInfo: object, overrideExisting?: boolean): void;
|
|
105
|
+
setCameraInfo(cameraInfo: object, overrideExisting?: boolean): void;
|
|
106
|
+
setMotionStatus(status: string): void;
|
|
107
|
+
setBackgroundMode(backgroundMode: boolean): void;
|
|
108
|
+
setZc(zc: string): void;
|
|
109
|
+
setInspectorOpened(opened: boolean): void;
|
|
110
|
+
/**
|
|
111
|
+
* Returns whether the DevTools inspector has been detected as open.
|
|
112
|
+
* Safe to call before WASM initialization (returns the in-memory flag).
|
|
113
|
+
*/
|
|
114
|
+
getInspectorOpened(): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Toggles the WASM module's production mode. When `true`, the native module
|
|
117
|
+
* suppresses its verbose debug logging/console output.
|
|
118
|
+
*/
|
|
119
|
+
setProductionMode(productionMode: boolean): Promise<void>;
|
|
120
|
+
getMetadata(): string;
|
|
121
|
+
analyzeFrame(image: ImageData): Promise<void>;
|
|
122
|
+
getCheck(): string;
|
|
123
|
+
/**
|
|
124
|
+
* Gets the current pipeline state. Must be called before setMotionStatus(),
|
|
125
|
+
* getCheck(), setBackgroundMode(), and getMetadata() for proper metadata generation.
|
|
126
|
+
*/
|
|
127
|
+
getPipelineState(): string;
|
|
128
|
+
estimatePerformance(): string;
|
|
129
|
+
isVirtualCamera(label: string | null): boolean;
|
|
130
|
+
prc(): Promise<void>;
|
|
131
|
+
poc(output: VirtualCameraCheckOutput): Promise<void>;
|
|
132
|
+
rsp(): Promise<void>;
|
|
133
|
+
ssl(): void;
|
|
134
|
+
stl(): void;
|
|
135
|
+
osv(): void;
|
|
136
|
+
oev(): void;
|
|
137
|
+
ckvcks(data: ArrayBuffer): void;
|
|
138
|
+
getVersions(): Promise<unknown>;
|
|
139
|
+
/**
|
|
140
|
+
* Disposes of resources and resets initialization state.
|
|
141
|
+
*/
|
|
142
|
+
dispose(): Promise<void>;
|
|
143
|
+
};
|
|
144
|
+
//#endregion
|
|
145
|
+
export { IRecordingCapability as a, IStorageCapability as i, VirtualCameraCheckOutput as n, RecordingConnection as o, WasmUtilConfig as r, IWasmUtilCapability as t };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region ../infra/src/providers/browser/IpifyProvider.ts
|
|
2
|
+
let cachedIp;
|
|
3
|
+
let inFlightLookup;
|
|
4
|
+
/**
|
|
5
|
+
* Resets the module-level IP cache. Intended for tests and full session resets.
|
|
6
|
+
*/
|
|
7
|
+
function resetIpifyCache() {
|
|
8
|
+
cachedIp = void 0;
|
|
9
|
+
inFlightLookup = void 0;
|
|
10
|
+
}
|
|
11
|
+
async function fetchIpFromIpify() {
|
|
12
|
+
if (typeof fetch === "undefined") return "";
|
|
13
|
+
let timeoutId = 0;
|
|
14
|
+
const controller = new AbortController();
|
|
15
|
+
if (AbortSignal.timeout) {
|
|
16
|
+
const signal = AbortSignal.timeout(3e3);
|
|
17
|
+
return (await (await fetch("https://api.ipify.org?format=json", { signal })).json()).ip;
|
|
18
|
+
}
|
|
19
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
20
|
+
timeoutId = setTimeout(() => {
|
|
21
|
+
controller.abort();
|
|
22
|
+
reject(/* @__PURE__ */ new Error("Request timeout"));
|
|
23
|
+
}, 3e3);
|
|
24
|
+
});
|
|
25
|
+
const fetchPromise = fetch("https://api.ipify.org?format=json", { signal: controller.signal }).then((res) => res.json()).then((data) => data.ip);
|
|
26
|
+
const result = await Promise.race([fetchPromise, timeoutPromise]);
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
var IpifyProvider = class {
|
|
31
|
+
async getIp() {
|
|
32
|
+
if (cachedIp !== void 0) return cachedIp;
|
|
33
|
+
if (inFlightLookup) return inFlightLookup;
|
|
34
|
+
inFlightLookup = (async () => {
|
|
35
|
+
try {
|
|
36
|
+
const ip = await fetchIpFromIpify();
|
|
37
|
+
cachedIp = ip;
|
|
38
|
+
return ip;
|
|
39
|
+
} catch {
|
|
40
|
+
cachedIp = "";
|
|
41
|
+
return "";
|
|
42
|
+
} finally {
|
|
43
|
+
inFlightLookup = void 0;
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
46
|
+
return inFlightLookup;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { resetIpifyCache as n, IpifyProvider as t };
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { AnyStateMachine, StateMachine, fromCallback, fromPromise } from "xstate";
|
|
2
|
-
|
|
3
1
|
//#region ../infra/src/manager/Manager.d.ts
|
|
4
|
-
|
|
5
2
|
/**
|
|
6
3
|
* Base manager interface providing state access, subscriptions, and lifecycle control.
|
|
7
4
|
* @template TPublicState - The public state type exposed to consumers
|
|
@@ -19,4 +16,4 @@ type Manager<TPublicState> = {
|
|
|
19
16
|
stop(): void;
|
|
20
17
|
};
|
|
21
18
|
//#endregion
|
|
22
|
-
export {
|
|
19
|
+
export { Manager as t };
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { t as createHiddenVideoElement } from "./video-C2WIj6TS.esm.js";
|
|
2
|
+
|
|
3
|
+
//#region ../infra/src/avatar/privacy-lens/privacyLensShaders.ts
|
|
4
|
+
/** Starting point; tuned live via the privacy-lens demo sliders. */
|
|
5
|
+
const PRIVACY_LENS_DEFAULTS = {
|
|
6
|
+
frost: .55,
|
|
7
|
+
sandblast: .28,
|
|
8
|
+
grainSize: .5,
|
|
9
|
+
brightness: 1.12,
|
|
10
|
+
shadowLift: .12,
|
|
11
|
+
warmth: .5,
|
|
12
|
+
sun: .71,
|
|
13
|
+
sunSpeed: .26
|
|
14
|
+
};
|
|
15
|
+
const PRIVACY_LENS_VERT = `
|
|
16
|
+
attribute vec2 aPos;
|
|
17
|
+
varying vec2 vUv;
|
|
18
|
+
void main() {
|
|
19
|
+
vUv = aPos * 0.5 + 0.5;
|
|
20
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
21
|
+
}`;
|
|
22
|
+
const PRIVACY_LENS_FRAG = `
|
|
23
|
+
// The grain hash (h21 below) feeds large gl_FragCoord-derived values through
|
|
24
|
+
// sin()*43758.5 — that overflows mediump's range on many mobile GPUs and
|
|
25
|
+
// collapses the grain to a flat artifact. Use highp where available (all WebGL2
|
|
26
|
+
// and most WebGL1 devices); fall back to mediump on the rare device without it.
|
|
27
|
+
#ifdef GL_FRAGMENT_PRECISION_HIGH
|
|
28
|
+
precision highp float;
|
|
29
|
+
#else
|
|
30
|
+
precision mediump float;
|
|
31
|
+
#endif
|
|
32
|
+
varying vec2 vUv;
|
|
33
|
+
uniform sampler2D uVideo;
|
|
34
|
+
uniform vec2 uRes; // canvas pixel size (square)
|
|
35
|
+
uniform vec2 uVideoRes; // decoded video pixel size
|
|
36
|
+
uniform float uTime; // seconds (sun drift only)
|
|
37
|
+
uniform float uFrost;
|
|
38
|
+
uniform float uSandblast;
|
|
39
|
+
uniform float uGrainSize;
|
|
40
|
+
uniform float uWarmth;
|
|
41
|
+
uniform float uBright;
|
|
42
|
+
uniform float uShadow;
|
|
43
|
+
uniform float uSun;
|
|
44
|
+
uniform float uSunSpeed;
|
|
45
|
+
|
|
46
|
+
// Static per-cell hash — NO time term, so the grain is a fixed matte surface.
|
|
47
|
+
float h21(vec2 p) {
|
|
48
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Cover-fit the (non-square) video into the square output, centre-cropped, so
|
|
52
|
+
// faces are never stretched.
|
|
53
|
+
vec2 coverUv(vec2 uv) {
|
|
54
|
+
float va = uVideoRes.x / max(uVideoRes.y, 1.0);
|
|
55
|
+
vec2 o = uv;
|
|
56
|
+
if (va > 1.0) o.x = (uv.x - 0.5) / va + 0.5; // landscape: crop sides
|
|
57
|
+
else o.y = (uv.y - 0.5) * va + 0.5; // portrait: crop top/bottom
|
|
58
|
+
return o;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const int N = 12;
|
|
62
|
+
|
|
63
|
+
void main() {
|
|
64
|
+
vec2 uv = vUv;
|
|
65
|
+
vec2 base = coverUv(uv);
|
|
66
|
+
float aspect = uRes.y / max(uRes.x, 1.0);
|
|
67
|
+
|
|
68
|
+
// Per-fragment static seed, clustered into grain cells. Small cells = ultra
|
|
69
|
+
// fine sandblast (effectively invisible pattern); larger = coarser frosting.
|
|
70
|
+
vec2 cell = floor(gl_FragCoord.xy / max(uGrainSize, 0.5));
|
|
71
|
+
float rnd = h21(cell);
|
|
72
|
+
float baseAngle = rnd * 6.2831853;
|
|
73
|
+
|
|
74
|
+
// Stochastic sandblasted scatter: an even golden-angle disk, but each pixel
|
|
75
|
+
// cell rotates + jitters the kernel differently → a fine matte grain rather
|
|
76
|
+
// than a smooth blur. The video moves UNDER this fixed glass grain.
|
|
77
|
+
vec3 col = vec3(0.0);
|
|
78
|
+
for (int i = 0; i < N; i++) {
|
|
79
|
+
float fi = float(i) + 0.5;
|
|
80
|
+
float ang = baseAngle + fi * 2.399963; // golden angle
|
|
81
|
+
float rad = sqrt(fi / float(N)); // even area coverage 0..1
|
|
82
|
+
float j = h21(cell + vec2(fi * 7.13, fi * 3.71));
|
|
83
|
+
float r = uFrost * 0.06 * rad + (j - 0.5) * uSandblast * 0.03;
|
|
84
|
+
vec2 off = vec2(cos(ang), sin(ang)) * r;
|
|
85
|
+
off.x *= aspect;
|
|
86
|
+
col += texture2D(uVideo, base + off).rgb;
|
|
87
|
+
}
|
|
88
|
+
col /= float(N);
|
|
89
|
+
|
|
90
|
+
// Airy + warm grade (luminous frosted glass, not murky).
|
|
91
|
+
col = col + uShadow * (1.0 - col);
|
|
92
|
+
col *= uBright;
|
|
93
|
+
vec3 warm = vec3(1.0, 0.92, 0.80);
|
|
94
|
+
col = mix(col, col * warm + vec3(0.03, 0.015, 0.0), uWarmth);
|
|
95
|
+
|
|
96
|
+
// Drifting sun: a broad soft glow + a fine STATIC sparkle (per-cell) that
|
|
97
|
+
// catches the ground-glass grain only where the light falls — not all-over.
|
|
98
|
+
vec2 sun = vec2(0.34 + 0.16 * sin(uTime * uSunSpeed),
|
|
99
|
+
0.26 + 0.10 * cos(uTime * uSunSpeed * 0.8));
|
|
100
|
+
float glow = smoothstep(0.7, 0.0, distance(uv, sun));
|
|
101
|
+
vec3 sunCol = vec3(1.0, 0.96, 0.88);
|
|
102
|
+
col += sunCol * glow * (0.20 + (rnd - 0.5) * 0.18 * uSandblast) * uSun;
|
|
103
|
+
|
|
104
|
+
gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
|
|
105
|
+
}`;
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region ../infra/src/avatar/privacy-lens/PrivacyLensProvider.ts
|
|
109
|
+
/**
|
|
110
|
+
* Privacy-lens avatar — sandblasted-glass effect over the **real** selfie video.
|
|
111
|
+
* **Self-contained** (see FACE_AVATAR.md → Isolation and ownership). No MediaPipe, no landmarks, no
|
|
112
|
+
* three/VRM, no npm deps, no textures but the live video — just a raw-WebGL
|
|
113
|
+
* fragment shader run on the video each frame (see `privacyLensShaders.ts`).
|
|
114
|
+
*
|
|
115
|
+
* Implements `IFaceAvatarCapability` (the generic `start/getCanvas/stop`
|
|
116
|
+
* contract) so it rides the existing concealment seam
|
|
117
|
+
* (`selfieConcealmentOption: 'OPTION_SILHOUETTE'`). The UI swaps the live `<Video>` for this
|
|
118
|
+
* canvas exactly as it does for the other avatars. Cosmetic-only: the authoritative
|
|
119
|
+
* pipeline still runs on the real frames; this only changes what is *displayed*.
|
|
120
|
+
*
|
|
121
|
+
* Mirroring is the UI's job (CSS), like every other provider — the shader
|
|
122
|
+
* renders forward.
|
|
123
|
+
*/
|
|
124
|
+
const DEFAULT_MAX_FPS = 30;
|
|
125
|
+
const RENDER_SIZE = 512;
|
|
126
|
+
const asRvfc = (video) => {
|
|
127
|
+
const v = video;
|
|
128
|
+
return typeof v.requestVideoFrameCallback === "function" && typeof v.cancelVideoFrameCallback === "function" ? v : null;
|
|
129
|
+
};
|
|
130
|
+
const readParams = () => {
|
|
131
|
+
if (typeof window === "undefined") return PRIVACY_LENS_DEFAULTS;
|
|
132
|
+
const override = window.__incodePrivacyLensParams;
|
|
133
|
+
return override ? {
|
|
134
|
+
...PRIVACY_LENS_DEFAULTS,
|
|
135
|
+
...override
|
|
136
|
+
} : PRIVACY_LENS_DEFAULTS;
|
|
137
|
+
};
|
|
138
|
+
var PrivacyLensProvider = class {
|
|
139
|
+
constructor() {
|
|
140
|
+
this.gl = null;
|
|
141
|
+
this.program = null;
|
|
142
|
+
this.quad = null;
|
|
143
|
+
this.videoTex = null;
|
|
144
|
+
this.uniforms = /* @__PURE__ */ new Map();
|
|
145
|
+
this.videoHandle = null;
|
|
146
|
+
this.rafId = null;
|
|
147
|
+
this.rvfcHandle = null;
|
|
148
|
+
this.usingRvfc = false;
|
|
149
|
+
this.stopped = false;
|
|
150
|
+
this.lastFrameAt = 0;
|
|
151
|
+
this.minFrameIntervalMs = 1e3 / DEFAULT_MAX_FPS;
|
|
152
|
+
this.startTime = 0;
|
|
153
|
+
this.loop = (now) => {
|
|
154
|
+
if (this.stopped) return;
|
|
155
|
+
this.scheduleNextFrame();
|
|
156
|
+
if (now - this.lastFrameAt < this.minFrameIntervalMs) return;
|
|
157
|
+
this.lastFrameAt = now;
|
|
158
|
+
const gl = this.gl;
|
|
159
|
+
const video = this.videoHandle?.element;
|
|
160
|
+
if (!gl || !this.program) return;
|
|
161
|
+
if (!video || video.readyState < 2 || !video.videoWidth) {
|
|
162
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
166
|
+
gl.bindTexture(gl.TEXTURE_2D, this.videoTex);
|
|
167
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);
|
|
168
|
+
const p = readParams();
|
|
169
|
+
const setF = (name, value) => {
|
|
170
|
+
const loc = this.uniforms.get(name);
|
|
171
|
+
if (loc) gl.uniform1f(loc, value);
|
|
172
|
+
};
|
|
173
|
+
const set2 = (name, x, y) => {
|
|
174
|
+
const loc = this.uniforms.get(name);
|
|
175
|
+
if (loc) gl.uniform2f(loc, x, y);
|
|
176
|
+
};
|
|
177
|
+
set2("uRes", RENDER_SIZE, RENDER_SIZE);
|
|
178
|
+
set2("uVideoRes", video.videoWidth, video.videoHeight);
|
|
179
|
+
setF("uTime", (now - this.startTime) / 1e3);
|
|
180
|
+
setF("uFrost", p.frost);
|
|
181
|
+
setF("uSandblast", p.sandblast);
|
|
182
|
+
setF("uGrainSize", p.grainSize);
|
|
183
|
+
setF("uWarmth", p.warmth);
|
|
184
|
+
setF("uBright", p.brightness);
|
|
185
|
+
setF("uShadow", p.shadowLift);
|
|
186
|
+
setF("uSun", p.sun);
|
|
187
|
+
setF("uSunSpeed", p.sunSpeed);
|
|
188
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
189
|
+
};
|
|
190
|
+
this.canvas = document.createElement("canvas");
|
|
191
|
+
this.canvas.width = RENDER_SIZE;
|
|
192
|
+
this.canvas.height = RENDER_SIZE;
|
|
193
|
+
}
|
|
194
|
+
getCanvas() {
|
|
195
|
+
return this.canvas;
|
|
196
|
+
}
|
|
197
|
+
async start(stream, options = {}) {
|
|
198
|
+
this.minFrameIntervalMs = 1e3 / (options.maxFps ?? DEFAULT_MAX_FPS);
|
|
199
|
+
this.videoHandle = createHiddenVideoElement(stream, { keepStreamAlive: true });
|
|
200
|
+
try {
|
|
201
|
+
this.initGl();
|
|
202
|
+
if (this.stopped) return;
|
|
203
|
+
this.startTime = performance.now();
|
|
204
|
+
const video = this.videoHandle.element;
|
|
205
|
+
this.usingRvfc = !!asRvfc(video);
|
|
206
|
+
this.scheduleNextFrame();
|
|
207
|
+
} catch (error) {
|
|
208
|
+
this.stop();
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
return Promise.resolve();
|
|
212
|
+
}
|
|
213
|
+
stop() {
|
|
214
|
+
this.stopped = true;
|
|
215
|
+
if (this.rafId != null) {
|
|
216
|
+
cancelAnimationFrame(this.rafId);
|
|
217
|
+
this.rafId = null;
|
|
218
|
+
}
|
|
219
|
+
const video = this.videoHandle?.element;
|
|
220
|
+
if (video && this.rvfcHandle != null) {
|
|
221
|
+
asRvfc(video)?.cancelVideoFrameCallback(this.rvfcHandle);
|
|
222
|
+
this.rvfcHandle = null;
|
|
223
|
+
}
|
|
224
|
+
const gl = this.gl;
|
|
225
|
+
if (gl) {
|
|
226
|
+
if (this.program) gl.deleteProgram(this.program);
|
|
227
|
+
if (this.quad) gl.deleteBuffer(this.quad);
|
|
228
|
+
if (this.videoTex) gl.deleteTexture(this.videoTex);
|
|
229
|
+
gl.getExtension("WEBGL_lose_context")?.loseContext();
|
|
230
|
+
}
|
|
231
|
+
this.program = null;
|
|
232
|
+
this.quad = null;
|
|
233
|
+
this.videoTex = null;
|
|
234
|
+
this.gl = null;
|
|
235
|
+
this.videoHandle?.dispose();
|
|
236
|
+
this.videoHandle = null;
|
|
237
|
+
}
|
|
238
|
+
initGl() {
|
|
239
|
+
const gl = this.canvas.getContext("webgl", {
|
|
240
|
+
alpha: false,
|
|
241
|
+
antialias: false,
|
|
242
|
+
premultipliedAlpha: false,
|
|
243
|
+
preserveDrawingBuffer: false
|
|
244
|
+
}) ?? this.canvas.getContext("experimental-webgl");
|
|
245
|
+
if (!gl) throw new Error("PrivacyLensProvider: WebGL is not available");
|
|
246
|
+
this.gl = gl;
|
|
247
|
+
const program = this.buildProgram(gl, PRIVACY_LENS_VERT, PRIVACY_LENS_FRAG);
|
|
248
|
+
this.program = program;
|
|
249
|
+
gl.useProgram(program);
|
|
250
|
+
const quad = gl.createBuffer();
|
|
251
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, quad);
|
|
252
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
253
|
+
-1,
|
|
254
|
+
-1,
|
|
255
|
+
1,
|
|
256
|
+
-1,
|
|
257
|
+
-1,
|
|
258
|
+
1,
|
|
259
|
+
1,
|
|
260
|
+
1
|
|
261
|
+
]), gl.STATIC_DRAW);
|
|
262
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
263
|
+
gl.enableVertexAttribArray(aPos);
|
|
264
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
|
|
265
|
+
this.quad = quad;
|
|
266
|
+
this.videoTex = this.makeTexture(gl, gl.CLAMP_TO_EDGE);
|
|
267
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
268
|
+
for (const name of [
|
|
269
|
+
"uVideo",
|
|
270
|
+
"uRes",
|
|
271
|
+
"uVideoRes",
|
|
272
|
+
"uTime",
|
|
273
|
+
"uFrost",
|
|
274
|
+
"uSandblast",
|
|
275
|
+
"uGrainSize",
|
|
276
|
+
"uWarmth",
|
|
277
|
+
"uBright",
|
|
278
|
+
"uShadow",
|
|
279
|
+
"uSun",
|
|
280
|
+
"uSunSpeed"
|
|
281
|
+
]) this.uniforms.set(name, gl.getUniformLocation(program, name));
|
|
282
|
+
gl.uniform1i(this.uniforms.get("uVideo") ?? null, 0);
|
|
283
|
+
gl.viewport(0, 0, RENDER_SIZE, RENDER_SIZE);
|
|
284
|
+
gl.clearColor(.88, .86, .83, 1);
|
|
285
|
+
}
|
|
286
|
+
buildProgram(gl, vertSrc, fragSrc) {
|
|
287
|
+
const compile = (type, src) => {
|
|
288
|
+
const shader = gl.createShader(type);
|
|
289
|
+
if (!shader) throw new Error("PrivacyLensProvider: createShader failed");
|
|
290
|
+
gl.shaderSource(shader, src);
|
|
291
|
+
gl.compileShader(shader);
|
|
292
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
293
|
+
const log = gl.getShaderInfoLog(shader);
|
|
294
|
+
gl.deleteShader(shader);
|
|
295
|
+
throw new Error(`PrivacyLensProvider: shader compile failed: ${log}`);
|
|
296
|
+
}
|
|
297
|
+
return shader;
|
|
298
|
+
};
|
|
299
|
+
const vs = compile(gl.VERTEX_SHADER, vertSrc);
|
|
300
|
+
const fs = compile(gl.FRAGMENT_SHADER, fragSrc);
|
|
301
|
+
const program = gl.createProgram();
|
|
302
|
+
if (!program) throw new Error("PrivacyLensProvider: createProgram failed");
|
|
303
|
+
gl.attachShader(program, vs);
|
|
304
|
+
gl.attachShader(program, fs);
|
|
305
|
+
gl.linkProgram(program);
|
|
306
|
+
gl.deleteShader(vs);
|
|
307
|
+
gl.deleteShader(fs);
|
|
308
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
309
|
+
const log = gl.getProgramInfoLog(program);
|
|
310
|
+
gl.deleteProgram(program);
|
|
311
|
+
throw new Error(`PrivacyLensProvider: program link failed: ${log}`);
|
|
312
|
+
}
|
|
313
|
+
return program;
|
|
314
|
+
}
|
|
315
|
+
makeTexture(gl, wrap) {
|
|
316
|
+
const tex = gl.createTexture();
|
|
317
|
+
if (!tex) throw new Error("PrivacyLensProvider: createTexture failed");
|
|
318
|
+
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
319
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);
|
|
320
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);
|
|
321
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
322
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
323
|
+
return tex;
|
|
324
|
+
}
|
|
325
|
+
scheduleNextFrame() {
|
|
326
|
+
if (this.stopped) return;
|
|
327
|
+
const video = this.videoHandle?.element;
|
|
328
|
+
const rvfc = this.usingRvfc && video ? asRvfc(video) : null;
|
|
329
|
+
if (rvfc) this.rvfcHandle = rvfc.requestVideoFrameCallback(this.loop);
|
|
330
|
+
else this.rafId = requestAnimationFrame(this.loop);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
/** Factory used by the avatar actor's provider selection (privacy-lens avatar). */
|
|
334
|
+
function createProvider() {
|
|
335
|
+
return new PrivacyLensProvider();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
//#endregion
|
|
339
|
+
export { createProvider };
|