@incodetech/core 2.3.2-rc.4 → 2.4.0-rc.0
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/THIRD_PARTY_NOTICES.txt +1243 -3
- package/dist/Actor-DpTj5PFb.d.ts +1 -0
- package/dist/{BaseWasmProvider-Dyi6dKp1.d.ts → BaseWasmProvider-BL9wIRnN.d.ts} +2 -2
- package/dist/{FaceDetectionProvider-B5Fxc_y9.esm.js → FaceDetectionProvider-BjTer9h3.esm.js} +126 -10
- package/dist/HttpRequestError-Bh0pNGSC.esm.js +35 -0
- package/dist/{IIdCaptureCapability-RNiFhvXR.d.ts → IIdCaptureCapability-DBsv9-7M.d.ts} +2 -2
- package/dist/{IWasmUtilCapability-CNWRl7jr.d.ts → IWasmUtilCapability-CPX0RGdQ.d.ts} +28 -5
- package/dist/{Manager-CQQ99QOI.d.ts → Manager-C9T5amUN.d.ts} +7 -1
- package/dist/{MotionSensorProvider-DyhbM4Si.esm.js → MotionSensorProvider-DYxh8TjR.esm.js} +1 -1
- package/dist/{ekycStateMachine-UeJRO8_p.esm.js → PhoneValidationProvider-SZiOS0jB.esm.js} +232 -827
- package/dist/{StreamCanvasCapture-_8gdW5Lk.d.ts → StreamCanvasCapture-DVmzJux5.d.ts} +2 -2
- package/dist/{safeStorage-BdU9_m2E.esm.js → WasmUtilProvider-CIdnE7Fx.esm.js} +95 -46
- package/dist/{addressSearch-DyHGgeX8.esm.js → addressSearch-BiYZjvp3.esm.js} +143 -4
- package/dist/{advanceableErrors-CpF2cBy6.esm.js → advanceableErrors-q_pfU3Cn.esm.js} +5 -4
- package/dist/ae-signature.d.ts +2 -2
- package/dist/ae-signature.esm.js +1 -1
- package/dist/antifraud.d.ts +1 -1
- package/dist/antifraud.esm.js +2 -2
- package/dist/{antifraudManager-BY36bS12.d.ts → antifraudManager-DbGCvlJs.d.ts} +2 -2
- package/dist/{antifraudManager-DNkw66oW.esm.js → antifraudManager-HL08jeDX.esm.js} +3 -3
- package/dist/{antifraudStateMachine-DBeq47D2.esm.js → antifraudStateMachine-DoJVzblM.esm.js} +3 -3
- package/dist/{apiError--p429c2X.esm.js → apiError-DcSWedC6.esm.js} +2 -1
- package/dist/authentication.d.ts +3 -3
- package/dist/authentication.esm.js +2 -2
- package/dist/{authenticationManager-CboRCl_N.d.ts → authenticationManager-CANv5-W5.d.ts} +2 -8
- package/dist/{authenticationManager-CWmZMFJH.esm.js → authenticationManager-SaiAxqvS.esm.js} +6 -6
- package/dist/{authenticationStateMachine-BQ7ZW-8a.esm.js → authenticationStateMachine-CHSxmV7z.esm.js} +5 -6
- package/dist/avatar.d.ts +1 -1
- package/dist/{backCameraStream-B0-YgP_y.esm.js → backCameraStream-CMvXj4X4.esm.js} +1 -1
- package/dist/camera.esm.js +1 -1
- package/dist/certificate-issuance.d.ts +1 -1
- package/dist/certificate-issuance.esm.js +2 -2
- package/dist/{certificateIssuanceManager-C3-CI0_s.esm.js → certificateIssuanceManager-CMg4SgL4.esm.js} +3 -3
- package/dist/{certificateIssuanceManager-DCgEidHz.d.ts → certificateIssuanceManager-Dr8A4Lgr.d.ts} +2 -3
- package/dist/{certificateIssuanceStateMachine-CxqS_nD-.esm.js → certificateIssuanceStateMachine-Cs64QmYH.esm.js} +4 -4
- package/dist/consent.d.ts +1 -1
- package/dist/consent.esm.js +2 -2
- package/dist/{consentManager-B6E1XJDw.esm.js → consentManager-CjrxY737.esm.js} +3 -3
- package/dist/{consentManager-uhDPdU6i.d.ts → consentManager-DgzWQpAR.d.ts} +11 -12
- package/dist/{consentStateMachine-DTSfdGiW.esm.js → consentStateMachine-BCj5Jb3g.esm.js} +3 -3
- package/dist/{createCameraCycleOwnership-DnwTl1ad.esm.js → createCameraCycleOwnership-kdlhkmmY.esm.js} +71 -65
- package/dist/{createFaceAvatar-BlcTYgJv.d.ts → createFaceAvatar-DXgmQmQy.d.ts} +1 -1
- package/dist/cross-document-data-match.d.ts +1 -1
- package/dist/cross-document-data-match.esm.js +1 -1
- package/dist/{crossDocumentDataMatchManager-9XhFVZ5S.esm.js → crossDocumentDataMatchManager-BHnGRsto.esm.js} +4 -4
- package/dist/{crossDocumentDataMatchManager-Dq8Z3SOg.d.ts → crossDocumentDataMatchManager-yCWCOzcU.d.ts} +2 -2
- package/dist/curp-validation.d.ts +1 -1
- package/dist/curp-validation.esm.js +2 -2
- package/dist/{curpValidationManager-DNuZn9fn.d.ts → curpValidationManager-B-1EZbP_.d.ts} +3 -3
- package/dist/{curpValidationManager-DbIMYFcJ.esm.js → curpValidationManager-DBNIn8BF.esm.js} +15 -22
- package/dist/{curpValidationStateMachine-g5kMfuLj.esm.js → curpValidationStateMachine-DAxImy8p.esm.js} +4 -4
- package/dist/custom-fields.d.ts +1 -1
- package/dist/custom-fields.esm.js +1 -1
- package/dist/custom-watchlist.d.ts +1 -1
- package/dist/custom-watchlist.esm.js +2 -2
- package/dist/{customFieldsManager-CzWZTkW-.esm.js → customFieldsManager-BV6UyLFV.esm.js} +4 -4
- package/dist/{customFieldsManager-8-W2KY4n.d.ts → customFieldsManager-CF-cO8ap.d.ts} +2 -2
- package/dist/{customWatchlistManager-DWTED5Ur.esm.js → customWatchlistManager-DML0UPzf.esm.js} +3 -3
- package/dist/{customWatchlistManager-PBWHr_oM.d.ts → customWatchlistManager-DolUswyR.d.ts} +2 -2
- package/dist/{customWatchlistStateMachine-DOQou6TW.esm.js → customWatchlistStateMachine-D9gI5uu7.esm.js} +3 -3
- package/dist/deepsightLoader-DvfAYnzg.esm.js +55 -0
- package/dist/{deepsightLoader-BtYvACzG.esm.js → deepsightService-DLGO9yv1.esm.js} +51 -56
- package/dist/device.esm.js +1 -1
- package/dist/document-capture.d.ts +2 -2
- package/dist/document-capture.esm.js +2 -2
- package/dist/{documentCaptureManager-BRPxqYD2.esm.js → documentCaptureManager-C9XUnYU6.esm.js} +17 -18
- package/dist/{documentCaptureManager-lEtCM320.d.ts → documentCaptureManager-DkyDtm3Y.d.ts} +11 -34
- package/dist/{documentCaptureStateMachine-D312sSIu.esm.js → documentCaptureStateMachine-BHDsCfhL.esm.js} +55 -58
- package/dist/dynamic-forms.d.ts +2 -2
- package/dist/dynamic-forms.esm.js +2 -2
- package/dist/{dynamicFormsManager-66GzzBTx.esm.js → dynamicFormsManager-5uIXobxi.esm.js} +3 -3
- package/dist/{dynamicFormsManager-D5R_uxLQ.d.ts → dynamicFormsManager-C0dHs1ty.d.ts} +3 -3
- package/dist/{dynamicFormsStateMachine-DLnr2ZtX.esm.js → dynamicFormsStateMachine-DQmok084.esm.js} +4 -4
- package/dist/ekyb.d.ts +5 -5
- package/dist/ekyb.esm.js +3 -3
- package/dist/{ekybManager-BwRuGAwt.d.ts → ekybManager-BaZ_7CEu.d.ts} +4 -4
- package/dist/{ekybManager-CsQMgJDL.esm.js → ekybManager-CazShiQz.esm.js} +23 -27
- package/dist/{ekybStateMachine-DBeQNOMo.esm.js → ekybStateMachine-hstiCNmW.esm.js} +338 -13
- package/dist/ekyc.d.ts +2 -2
- package/dist/ekyc.esm.js +3 -3
- package/dist/{ekycManager-BX2d46FY.esm.js → ekycManager-BdJRUsz0.esm.js} +29 -36
- package/dist/{ekycManager-DLzDuBzI.d.ts → ekycManager-DW-ynodd.d.ts} +3 -3
- package/dist/ekycStateMachine-x6Klot8g.esm.js +1444 -0
- package/dist/{ekycUtils-D6wfSpPN.esm.js → ekycUtils-zY8CdKJL.esm.js} +53 -3
- package/dist/electronic-signature.d.ts +1 -1
- package/dist/electronic-signature.esm.js +1 -1
- package/dist/{electronicSignatureManager-Boj_xbGN.esm.js → electronicSignatureManager-Bc8spG8p.esm.js} +10 -10
- package/dist/{electronicSignatureManager-Ds-KEVTq.d.ts → electronicSignatureManager-DTSLOvKR.d.ts} +2 -3
- package/dist/email.d.ts +1 -1
- package/dist/email.esm.js +2 -2
- package/dist/{emailManager-bR1N5rV_.esm.js → emailManager-CtlKRRaR.esm.js} +20 -26
- package/dist/{emailManager-CADXW_9X.d.ts → emailManager-Dy6omJVp.d.ts} +2 -2
- package/dist/{emailStateMachine-Bc_6oIYw.esm.js → emailStateMachine-5Neq3rE5.esm.js} +4 -4
- package/dist/{endpoints-B-3Q-LUw.esm.js → endpoints-DHzlkQNe.esm.js} +2 -0
- package/dist/{events-ijlbX_Wx.esm.js → events-CAgFE-k3.esm.js} +19 -7
- package/dist/events.d.ts +3 -2
- package/dist/events.esm.js +1 -1
- package/dist/extensibility.d.ts +38 -38
- package/dist/extensibility.esm.js +36 -36
- package/dist/{externalFetch-BKBThAUC.esm.js → externalFetch-DrR9xshk.esm.js} +3 -2
- package/dist/face-match.d.ts +1 -1
- package/dist/face-match.esm.js +2 -2
- package/dist/{faceCaptureManagerFactory-m-7ae67q.d.ts → faceCaptureManagerFactory-jKQ2QtY-.d.ts} +11 -51
- package/dist/{faceCaptureManagerFactory-BKpeQIZu.esm.js → faceCaptureManagerFactory-uFm1AcaY.esm.js} +19 -54
- package/dist/{faceCaptureSetup-DOrt8-Sn.esm.js → faceCaptureSetup-Cu2wabzo.esm.js} +99 -395
- package/dist/{faceMatchManager-Bmv0HzuY.esm.js → faceMatchManager-9Nj9aPci.esm.js} +3 -3
- package/dist/{faceMatchManager-BnvrZM2F.d.ts → faceMatchManager-DIgG-UFS.d.ts} +1 -2
- package/dist/{faceMatchStateMachine-mRIHQ3dA.esm.js → faceMatchStateMachine-B9ZUnlyU.esm.js} +6 -4
- package/dist/{feature-management-zY6FcYx_.esm.js → feature-management-BTbYruNe.esm.js} +3 -3
- package/dist/feature-management.esm.js +1 -1
- package/dist/field-comparison.d.ts +2 -2
- package/dist/field-comparison.esm.js +1 -1
- package/dist/{fieldComparisonManager-CBvEGxFx.d.ts → fieldComparisonManager-CUX4gza2.d.ts} +6 -3
- package/dist/{fieldComparisonManager-CC-klG0h.esm.js → fieldComparisonManager-Dk38hXZP.esm.js} +35 -17
- package/dist/fiscal-qr.d.ts +1 -1
- package/dist/fiscal-qr.esm.js +1 -1
- package/dist/{fiscalQrManager-B1STmT6z.d.ts → fiscalQrManager-D0Iy7EKR.d.ts} +2 -2
- package/dist/fiscalQrManager-DmBkQfs0.esm.js +6798 -0
- package/dist/flow-events.d.ts +1 -1
- package/dist/flow.d.ts +14 -13
- package/dist/flow.esm.js +14 -14
- package/dist/{flowCompletionService-CBa6YyI5.esm.js → flowCompletionService-xnn_SlJU.esm.js} +2 -2
- package/dist/{flowServices-JW6uRaUt.esm.js → flowServices-DA64AEZC.esm.js} +11 -7
- package/dist/geolocation.d.ts +1 -1
- package/dist/geolocation.esm.js +2 -2
- package/dist/{geolocationManager-DD5J1T_p.esm.js → geolocationManager-CqNLY45e.esm.js} +6 -7
- package/dist/{geolocationManager-Cz744E5S.d.ts → geolocationManager-Dn24g1fl.d.ts} +2 -3
- package/dist/{geolocationStateMachine-DoelwBqs.esm.js → geolocationStateMachine-D-cQi7ar.esm.js} +4 -4
- package/dist/{getDeviceClass-5NYZg9s6.esm.js → getDeviceClass-bsWdEDxP.esm.js} +1 -1
- package/dist/{getParsedUserAgent-B2iFDql1.esm.js → getParsedUserAgent-DhQPeKqw.esm.js} +1 -1
- package/dist/government-validation.d.ts +1 -1
- package/dist/government-validation.esm.js +2 -2
- package/dist/{governmentValidationManager-D02vT4yY.d.ts → governmentValidationManager-B82zOut8.d.ts} +3 -3
- package/dist/{governmentValidationManager-CacFOtKO.esm.js → governmentValidationManager-CP0SiOOe.esm.js} +3 -3
- package/dist/{governmentValidationStateMachine-CoaZOSTP.esm.js → governmentValidationStateMachine-C3YQ8yCZ.esm.js} +3 -3
- package/dist/home.d.ts +3 -26
- package/dist/home.esm.js +2 -2
- package/dist/id-ocr.d.ts +1 -1
- package/dist/id-ocr.esm.js +2 -2
- package/dist/id-selfie-flow.d.ts +6 -9
- package/dist/id-selfie-flow.esm.js +23 -28
- package/dist/id-verification.d.ts +1 -1
- package/dist/id-verification.esm.js +2 -2
- package/dist/id.d.ts +4 -4
- package/dist/id.esm.js +4 -205
- package/dist/{idCaptureDefaults-Chne8cyb.esm.js → idCaptureDefaults-CBg73RnV.esm.js} +8 -5
- package/dist/{idCaptureManager-BHwL2Z0V.d.ts → idCaptureManager-BY97SRCV.d.ts} +242 -98
- package/dist/{idCaptureManager-0504dfcD.esm.js → idCaptureManager-D4V8vXtY.esm.js} +276 -210
- package/dist/{idCaptureServices-B-Ynn67N.esm.js → idCaptureServices-DJ33k3-p.esm.js} +21 -39
- package/dist/{idCaptureStateMachine-B7ET-hfq.esm.js → idCaptureStateMachine-PJt0yzom.esm.js} +989 -872
- package/dist/{idOcrManager-BF_cXZq8.d.ts → idOcrManager-BTdHlJ9D.d.ts} +3 -4
- package/dist/{idOcrManager-ByWuQ4ej.esm.js → idOcrManager-DxoCesYP.esm.js} +3 -3
- package/dist/{idOcrStateMachine-Bt_abXQQ.esm.js → idOcrStateMachine-kPn7DB2I.esm.js} +3 -3
- package/dist/{idVerificationManager-BB4Pj_N6.d.ts → idVerificationManager-BJapZfpy.d.ts} +2 -3
- package/dist/{idVerificationManager-DT42c77H.esm.js → idVerificationManager-CDhRUU5n.esm.js} +3 -3
- package/dist/{idVerificationStateMachine-DbDVIh9t.esm.js → idVerificationStateMachine-0HTVVxse.esm.js} +3 -3
- package/dist/identity-reuse.d.ts +2 -2
- package/dist/identity-reuse.esm.js +2 -2
- package/dist/{identityReuseManager-yG3acUrQ.esm.js → identityReuseManager-BleUi6TK.esm.js} +26 -13
- package/dist/{identityReuseManager-v2TH5g7e.d.ts → identityReuseManager-ooAbp6Kc.d.ts} +162 -44
- package/dist/{identityReuseStateMachine-BhAkuIra.esm.js → identityReuseStateMachine-BrBUpfn5.esm.js} +89 -23
- package/dist/{index-CeaC32qI.d.ts → index-DfEuu-Ew.d.ts} +2 -2
- package/dist/index-DpTj5PFb.d.ts +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/{invokeOnCaptureCallback-BjzPjJ_p.esm.js → invokeOnCaptureCallback-BW7V3vub.esm.js} +1 -1
- package/dist/lamejs-B6TzhU5q.esm.js +10 -0
- package/dist/mandatory-consent.d.ts +2 -2
- package/dist/mandatory-consent.esm.js +2 -2
- package/dist/{mandatoryConsentManager-7dI0D08q.esm.js → mandatoryConsentManager-CX_Dyht7.esm.js} +3 -3
- package/dist/{mandatoryConsentManager-BYRnWbIC.d.ts → mandatoryConsentManager-TkX57U6f.d.ts} +8 -9
- package/dist/{mandatoryConsentStateMachine-DC5Mo6M1.esm.js → mandatoryConsentStateMachine-CoaSB7P7.esm.js} +3 -3
- package/dist/{multipartRecordingService-mwKFTlhR.esm.js → multipartRecordingService-DbeQpXdU.esm.js} +2 -2
- package/dist/{permissionGuards-D6TfVop2.esm.js → permissionGuards-Bf4LbHjC.esm.js} +1 -1
- package/dist/{permissionServices-EY3_Vx6c.esm.js → permissionServices-d2UW0r_L.esm.js} +34 -3
- package/dist/phone-number.d.ts +24 -0
- package/dist/phone-number.esm.js +1922 -0
- package/dist/phone.d.ts +1 -1
- package/dist/phone.esm.js +2 -2
- package/dist/{phoneManager-IjhSv5XS.esm.js → phoneManager-BGBcpqsk.esm.js} +31 -22
- package/dist/{phoneManager-BBU8Lq0O.d.ts → phoneManager-BO-LTih5.d.ts} +16 -3
- package/dist/{phoneStateMachine-CXdXufKg.esm.js → phoneStateMachine-CEm2y7yG.esm.js} +39 -20
- package/dist/phoneValidation-DnBcNUNh.esm.js +48 -0
- package/dist/qe-signature.d.ts +2 -2
- package/dist/qe-signature.esm.js +1 -1
- package/dist/redirect-to-mobile.d.ts +1 -1
- package/dist/redirect-to-mobile.esm.js +2 -2
- package/dist/{redirectToMobileManager-FLEWJtv8.esm.js → redirectToMobileManager-B1yQHFLu.esm.js} +4 -4
- package/dist/{redirectToMobileManager-BD2PvT5B.d.ts → redirectToMobileManager-CVsvpVbQ.d.ts} +2 -2
- package/dist/{redirectToMobileStateMachine-CSWWgUTO.esm.js → redirectToMobileStateMachine--Sr9NEVT.esm.js} +5 -5
- package/dist/{rolldown-runtime-FDOR9p9I.esm.js → rolldown-runtime-B-1-B7_t.esm.js} +10 -1
- package/dist/{runChildModule-CZU29-IV.esm.js → runChildModule-vdxQMCmO.esm.js} +13 -12
- package/dist/safeStorage-UxDrnjwa.esm.js +35 -0
- package/dist/{sdkVersion-DOhxIxQQ.esm.js → sdkVersion-F5YZbjip.esm.js} +1 -1
- package/dist/selfie.d.ts +4 -4
- package/dist/selfie.esm.js +12 -12
- package/dist/selfieErrorUtils-D-tsgEuX.esm.js +21 -0
- package/dist/{selfieManager-BSZG891S.d.ts → selfieManager-1J0IEyFq.d.ts} +2 -8
- package/dist/{selfieManager-CWhbwRdb.esm.js → selfieManager-26pENXxw.esm.js} +6 -6
- package/dist/selfieStateMachine-BhfKsl3I.esm.js +41 -0
- package/dist/{session-CctUSSCx.esm.js → session-Bu7djCsj.esm.js} +5 -5
- package/dist/session.d.ts +15 -3
- package/dist/session.esm.js +30 -5
- package/dist/sessionInitializer-jxbfCnE-.esm.js +974 -0
- package/dist/{setup-DmB0JHAB.esm.js → setup-C38QkrSP.esm.js} +232 -112
- package/dist/{setup-Cyko6cAn.d.ts → setup-lgkQ8dJW.d.ts} +20 -11
- package/dist/signature.d.ts +1 -1
- package/dist/signature.esm.js +2 -2
- package/dist/{signatureManager-DGBSWz2_.d.ts → signatureManager-BpVt_Jv7.d.ts} +2 -2
- package/dist/{signatureManager-B72np4ZO.esm.js → signatureManager-qqXyH93e.esm.js} +7 -11
- package/dist/{signatureStateMachine-ce_XMA3l.esm.js → signatureStateMachine-BkRSrkKp.esm.js} +3 -3
- package/dist/splitTrackedName-3zJRd2RD.esm.js +19 -0
- package/dist/{src-35ekGRzK.esm.js → src-DJAJjRYQ.esm.js} +1 -1
- package/dist/{stats-CZcy2J53.esm.js → stats-DmG_tkGk.esm.js} +1 -1
- package/dist/stats.esm.js +1 -1
- package/dist/{sessionInitializer-Ce9zO78j.esm.js → thumbmark.esm-CRc0cYvz.esm.js} +33 -776
- package/dist/{trueSightService-oMFESSSb.esm.js → trueSightService-BWgRVGIT.esm.js} +893 -900
- package/dist/trust-graph.d.ts +1 -2
- package/dist/trust-graph.esm.js +2 -2
- package/dist/{types-C0oWGUzg.d.ts → types-0L-eFDmr.d.ts} +1 -1
- package/dist/{types-C1g9itHE.d.ts → types-BGXxRwQM.d.ts} +6 -7
- package/dist/{types-BfgmV7s7.d.ts → types-BQA7lRDV.d.ts} +1 -1
- package/dist/{types-CxGdmzxa.d.ts → types-BvFmYX5c.d.ts} +1 -1
- package/dist/{types-Cx-1zo-i.d.ts → types-BvLo3U4u.d.ts} +1 -1
- package/dist/types-C71Zo6vl.d.ts +6 -0
- package/dist/{types-DEGVXwsk2.d.ts → types-CyPUIpzf.d.ts} +110 -62
- package/dist/{types-Bx-BWveD.d.ts → types-DTYr9pCB.d.ts} +1 -1
- package/dist/{types-BjSly8cp.d.ts → types-DUnFZ08M.d.ts} +1 -1
- package/dist/{types-ESdtnHtg.d.ts → types-zpO4fU6a.d.ts} +3 -4
- package/dist/{urlUtils-D6phjq1-.esm.js → urlUtils-6jsE6rKp.esm.js} +9 -1
- package/dist/video-selfie.d.ts +6 -9
- package/dist/video-selfie.esm.js +1386 -1344
- package/dist/{videoSelfieCameraWarmer-D_4NwYM-.esm.js → videoSelfieCameraWarmer-C366RKqu.esm.js} +11 -11
- package/dist/{videoSelfieFlowModuleMachine-BUe2uACW.esm.js → videoSelfieFlowModuleMachine-BCFVHBQ1.esm.js} +1 -1
- package/dist/{videoSelfieStepDetector-ChYgFM15.d.ts → videoSelfieStepDetector-C5QHOvWb.d.ts} +4 -4
- package/dist/videoTrimByCopy-BFfAiNpv.esm.js +15901 -0
- package/dist/{warmup-Cis2p6O0.d.ts → warmup-BUPPRAA1.d.ts} +7 -0
- package/dist/{warmup-ChDwHSel.esm.js → warmup-DMtbyb2l.esm.js} +27 -9
- package/dist/wasm.d.ts +2 -2
- package/dist/wasm.esm.js +4 -4
- package/dist/{wasmDsFlagSync-DYrLUEII.esm.js → wasmDsFlagSync-BXCGqP48.esm.js} +1 -1
- package/dist/{wasmWebClient-B7baE-Wf.esm.js → wasmWebClient-kbYZ2sxw.esm.js} +259 -20
- package/dist/watchlist-for-business.d.ts +1 -1
- package/dist/watchlist-for-business.esm.js +2 -2
- package/dist/watchlist.d.ts +1 -1
- package/dist/watchlist.esm.js +2 -2
- package/dist/{watchlistForBusinessManager-CsnJnG-C.d.ts → watchlistForBusinessManager-B3GDPZrr.d.ts} +2 -2
- package/dist/{watchlistForBusinessManager-CIMkpEhu.esm.js → watchlistForBusinessManager-BvF4jK3S.esm.js} +7 -5
- package/dist/{watchlistForBusinessStateMachine-CJ-MvUre.esm.js → watchlistForBusinessStateMachine-121XK-Et.esm.js} +3 -3
- package/dist/{watchlistManager-CixcLNDT.esm.js → watchlistManager-CNWEOYSq.esm.js} +3 -3
- package/dist/{watchlistManager-DLXef90v.d.ts → watchlistManager-DJQOd8Pw.d.ts} +2 -2
- package/dist/{watchlistStateMachine-CBqk2w-h.esm.js → watchlistStateMachine-Dgfm42w2.esm.js} +3 -3
- package/dist/workflow.d.ts +34 -5
- package/dist/workflow.esm.js +64 -46
- package/dist/{xstate-actors.esm-BXeQ-Ucz.esm.js → xstate-actors.esm-8Gzepa_A.esm.js} +1 -1
- package/dist/{xstate.esm-BuFLFuzz.esm.js → xstate.esm-DSajW7CJ.esm.js} +24 -10
- package/package.json +13 -5
- package/dist/Actor-iTq7YY48.d.ts +0 -1
- package/dist/StateMachine-EDpYWy0i.d.ts +0 -6
- package/dist/fiscalQrManager-DbCVMIBx.esm.js +0 -34143
- package/dist/index-B8weJxmL.d.ts +0 -1
- package/dist/selfieErrorUtils-UiQ46EBa.esm.js +0 -116
- package/dist/selfieStateMachine-CtMCi4KZ.esm.js +0 -71
- package/dist/types-BN5RPPIZ.esm.js +0 -34
- package/dist/types-Bt9RuRqt.d.ts +0 -6
- package/dist/virtualCameraCheck-Cjab7FTI.esm.js +0 -48
- /package/dist/{types-BSBzhHRH.d.ts → types-BSBzhHRH2.d.ts} +0 -0
|
@@ -0,0 +1,974 @@
|
|
|
1
|
+
import { S as noteTokenActivated, _ as resetFeatureConfigCache, g as isFeatureEnabled, h as fetchFeatureConfig, l as trueSightLog, s as startTrueSightCollection, y as noteEnvironment } from "./trueSightService-BWgRVGIT.esm.js";
|
|
2
|
+
import { S as subscribeEvent, v as addEvent, y as getAnalyticsBatcher } from "./events-CAgFE-k3.esm.js";
|
|
3
|
+
import { c as setToken, r as getToken, t as api } from "./api-Bx3gKW_y.esm.js";
|
|
4
|
+
import { t as endpoints } from "./endpoints-DHzlkQNe.esm.js";
|
|
5
|
+
import { t as SDK_VERSION } from "./sdkVersion-F5YZbjip.esm.js";
|
|
6
|
+
import { E as updateFeatureManagementUser } from "./feature-management-BTbYruNe.esm.js";
|
|
7
|
+
import { n as flushDeviceStatsQueue, r as resetDeviceStatsQueue } from "./stats-DmG_tkGk.esm.js";
|
|
8
|
+
import { t as getParsedUserAgent } from "./getParsedUserAgent-DhQPeKqw.esm.js";
|
|
9
|
+
import { t as BrowserLazyImportProvider } from "./BrowserLazyImportProvider-BhoA957O.esm.js";
|
|
10
|
+
import { a as isIOS } from "./platform-DkcRc9JV.esm.js";
|
|
11
|
+
import { t as getUserAgent } from "./getBrowser-CBiibsL-.esm.js";
|
|
12
|
+
import { i as linkSessionWithTRI, r as isTRIStarted } from "./tri-xzRLIIMN.esm.js";
|
|
13
|
+
//#region src/internal/fingerprint/fingerprintSignalsReporter.ts
|
|
14
|
+
const START_INTERVIEW_EVENT = "modelLoadEnd";
|
|
15
|
+
const CAPTURE_INTERVIEW_EVENT = "captureAttemptFinished";
|
|
16
|
+
const START_SIGNALS = ["pid", "device"];
|
|
17
|
+
function createFingerprintSignalsReporter(deps) {
|
|
18
|
+
let enabled = true;
|
|
19
|
+
let sessionActive = false;
|
|
20
|
+
let wasmReady = false;
|
|
21
|
+
let started = false;
|
|
22
|
+
let pendingStartSignals = START_SIGNALS;
|
|
23
|
+
let prefetchStarted = false;
|
|
24
|
+
let deviceDataUpdated = true;
|
|
25
|
+
let unsubscribe = null;
|
|
26
|
+
let optOutApplied = false;
|
|
27
|
+
let optInPending = false;
|
|
28
|
+
let queue = Promise.resolve();
|
|
29
|
+
let generation = 0;
|
|
30
|
+
function enqueue(work) {
|
|
31
|
+
const scheduledGeneration = generation;
|
|
32
|
+
queue = queue.then(async () => {
|
|
33
|
+
if (scheduledGeneration !== generation) return;
|
|
34
|
+
await work();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function send(token, interviewEvent, type) {
|
|
38
|
+
const metadata = await (await deps.getWasmUtil()).getFingerprintSignals(type);
|
|
39
|
+
if (!metadata) return;
|
|
40
|
+
if (deps.getToken() !== token) return;
|
|
41
|
+
await deps.post(endpoints.deviceFingerprintSignals, {
|
|
42
|
+
interviewEvent,
|
|
43
|
+
metadata
|
|
44
|
+
}, { "X-Incode-Hardware-Id": token });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sends `types` in order and stops at the first failure. Resolves to the
|
|
48
|
+
* types left unsent (empty when every send went through).
|
|
49
|
+
*/
|
|
50
|
+
async function sendAll(token, interviewEvent, types) {
|
|
51
|
+
for (const [index, type] of types.entries()) try {
|
|
52
|
+
await send(token, interviewEvent, type);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
deps.reportFailure({
|
|
55
|
+
message: error instanceof Error ? error.message : String(error),
|
|
56
|
+
signalsType: type,
|
|
57
|
+
interviewEvent
|
|
58
|
+
});
|
|
59
|
+
return types.slice(index);
|
|
60
|
+
}
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
/** Switches native behaviour collection (`sbc`); resolves to whether it worked. */
|
|
64
|
+
async function applyNativeCollection(on) {
|
|
65
|
+
try {
|
|
66
|
+
(await deps.getWasmUtil()).setBehaviourSignalsCollection(on);
|
|
67
|
+
return true;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
deps.reportFailure({
|
|
70
|
+
message: error instanceof Error ? error.message : String(error),
|
|
71
|
+
signalsType: "behaviour",
|
|
72
|
+
interviewEvent: START_INTERVIEW_EVENT
|
|
73
|
+
});
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function applyNativeOptOut() {
|
|
78
|
+
if (optOutApplied || enabled) return;
|
|
79
|
+
optOutApplied = true;
|
|
80
|
+
if (!await applyNativeCollection(false)) optOutApplied = false;
|
|
81
|
+
}
|
|
82
|
+
async function applyNativeOptIn() {
|
|
83
|
+
if (!optInPending) return;
|
|
84
|
+
optInPending = false;
|
|
85
|
+
if (!await applyNativeCollection(true)) optInPending = true;
|
|
86
|
+
}
|
|
87
|
+
function startPrefetch() {
|
|
88
|
+
if (prefetchStarted) return;
|
|
89
|
+
prefetchStarted = true;
|
|
90
|
+
deps.getWasmUtil().then((wasmUtil) => wasmUtil.prefetchFingerprintSignals()).catch(() => void 0);
|
|
91
|
+
}
|
|
92
|
+
function tryStart() {
|
|
93
|
+
if (!wasmReady) return;
|
|
94
|
+
if (!enabled) {
|
|
95
|
+
enqueue(applyNativeOptOut);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const token = deps.getToken();
|
|
99
|
+
if (!token) return;
|
|
100
|
+
startPrefetch();
|
|
101
|
+
if (optInPending) enqueue(applyNativeOptIn);
|
|
102
|
+
if (started || !sessionActive) return;
|
|
103
|
+
started = true;
|
|
104
|
+
ensureSubscribed();
|
|
105
|
+
const startGeneration = generation;
|
|
106
|
+
const allowRetry = (unsent) => {
|
|
107
|
+
if (startGeneration !== generation) return;
|
|
108
|
+
pendingStartSignals = unsent;
|
|
109
|
+
started = false;
|
|
110
|
+
};
|
|
111
|
+
enqueue(async () => {
|
|
112
|
+
if (!await applyNativeCollection(true)) {
|
|
113
|
+
allowRetry(pendingStartSignals);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
deviceDataUpdated = false;
|
|
117
|
+
const unsent = await sendAll(token, START_INTERVIEW_EVENT, pendingStartSignals);
|
|
118
|
+
if (unsent.length > 0) allowRetry(unsent);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function onCaptureAttemptFinished() {
|
|
122
|
+
wasmReady = true;
|
|
123
|
+
tryStart();
|
|
124
|
+
const token = deps.getToken();
|
|
125
|
+
if (!enabled || !started || !token) return;
|
|
126
|
+
enqueue(async () => {
|
|
127
|
+
const types = [];
|
|
128
|
+
if (deviceDataUpdated) {
|
|
129
|
+
deviceDataUpdated = false;
|
|
130
|
+
types.push("device");
|
|
131
|
+
}
|
|
132
|
+
types.push("behaviour");
|
|
133
|
+
await sendAll(token, CAPTURE_INTERVIEW_EVENT, types);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function ensureSubscribed() {
|
|
137
|
+
if (unsubscribe) return;
|
|
138
|
+
unsubscribe = deps.subscribe((event) => {
|
|
139
|
+
if (event.code === CAPTURE_INTERVIEW_EVENT) onCaptureAttemptFinished();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function resetSession() {
|
|
143
|
+
generation += 1;
|
|
144
|
+
sessionActive = false;
|
|
145
|
+
started = false;
|
|
146
|
+
pendingStartSignals = START_SIGNALS;
|
|
147
|
+
optInPending = false;
|
|
148
|
+
deviceDataUpdated = true;
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
setEnabled(value) {
|
|
152
|
+
if (value === enabled) return;
|
|
153
|
+
enabled = value;
|
|
154
|
+
if (value) {
|
|
155
|
+
const wasOptedOut = optOutApplied;
|
|
156
|
+
optOutApplied = false;
|
|
157
|
+
optInPending = wasOptedOut && started;
|
|
158
|
+
} else optInPending = false;
|
|
159
|
+
tryStart();
|
|
160
|
+
},
|
|
161
|
+
onSessionActivated() {
|
|
162
|
+
sessionActive = true;
|
|
163
|
+
ensureSubscribed();
|
|
164
|
+
tryStart();
|
|
165
|
+
},
|
|
166
|
+
onWasmReady() {
|
|
167
|
+
wasmReady = true;
|
|
168
|
+
ensureSubscribed();
|
|
169
|
+
tryStart();
|
|
170
|
+
},
|
|
171
|
+
onTokenAvailable() {
|
|
172
|
+
tryStart();
|
|
173
|
+
},
|
|
174
|
+
onCameraInfoUpdated() {
|
|
175
|
+
deviceDataUpdated = true;
|
|
176
|
+
},
|
|
177
|
+
resetSession,
|
|
178
|
+
reset() {
|
|
179
|
+
resetSession();
|
|
180
|
+
wasmReady = false;
|
|
181
|
+
optOutApplied = false;
|
|
182
|
+
prefetchStarted = false;
|
|
183
|
+
unsubscribe?.();
|
|
184
|
+
unsubscribe = null;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const fingerprintSignalsReporter = createFingerprintSignalsReporter({
|
|
189
|
+
getWasmUtil: async () => {
|
|
190
|
+
const { WasmUtilProvider } = await import("./WasmUtilProvider-CIdnE7Fx.esm.js").then((n) => n.n);
|
|
191
|
+
return WasmUtilProvider.getInstance();
|
|
192
|
+
},
|
|
193
|
+
getToken: () => getToken(),
|
|
194
|
+
post: (url, body, headers) => api.post(url, body, { headers }),
|
|
195
|
+
subscribe: (listener) => subscribeEvent(listener),
|
|
196
|
+
reportFailure: ({ message, signalsType, interviewEvent }) => trueSightLog("warning", "wasm", "other", `fingerprint signals failed type=${signalsType} event=${interviewEvent} error=${message}`)
|
|
197
|
+
});
|
|
198
|
+
//#endregion
|
|
199
|
+
//#region ../infra/src/providers/browser/BrowserEnvironmentProvider.ts
|
|
200
|
+
var BrowserEnvironmentProvider = class {
|
|
201
|
+
getScreenDimensions() {
|
|
202
|
+
if (typeof screen === "undefined") return {
|
|
203
|
+
width: 0,
|
|
204
|
+
height: 0
|
|
205
|
+
};
|
|
206
|
+
return {
|
|
207
|
+
width: screen.width,
|
|
208
|
+
height: screen.height
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
generateCanvasFingerprint() {
|
|
212
|
+
try {
|
|
213
|
+
if (typeof document === "undefined") return "";
|
|
214
|
+
const canvas = document.createElement("canvas");
|
|
215
|
+
const ctx = canvas.getContext("2d");
|
|
216
|
+
if (!ctx) return "";
|
|
217
|
+
ctx.textBaseline = "top";
|
|
218
|
+
ctx.font = "14px Arial";
|
|
219
|
+
ctx.fillText("fingerprint", 2, 2);
|
|
220
|
+
return canvas.toDataURL().slice(-50);
|
|
221
|
+
} catch {
|
|
222
|
+
return "";
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
getWebGLRenderer() {
|
|
226
|
+
try {
|
|
227
|
+
if (typeof document === "undefined") return "";
|
|
228
|
+
const canvas = document.createElement("canvas");
|
|
229
|
+
const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
|
|
230
|
+
if (!gl) return "";
|
|
231
|
+
const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
|
|
232
|
+
if (!debugInfo) return "";
|
|
233
|
+
return gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || "";
|
|
234
|
+
} catch {
|
|
235
|
+
return "";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
getWindowProperty(prop) {
|
|
239
|
+
if (typeof window === "undefined") return;
|
|
240
|
+
return window[prop];
|
|
241
|
+
}
|
|
242
|
+
getNavigatorProperty(prop) {
|
|
243
|
+
if (typeof navigator === "undefined") return;
|
|
244
|
+
return navigator[prop];
|
|
245
|
+
}
|
|
246
|
+
getNavigatorPrefixes() {
|
|
247
|
+
if (typeof navigator === "undefined") return {
|
|
248
|
+
webkit: false,
|
|
249
|
+
moz: false,
|
|
250
|
+
o: false,
|
|
251
|
+
ms: false
|
|
252
|
+
};
|
|
253
|
+
const nav = navigator;
|
|
254
|
+
return {
|
|
255
|
+
webkit: nav.webkitGetUserMedia !== void 0,
|
|
256
|
+
moz: nav.mozGetUserMedia !== void 0,
|
|
257
|
+
o: nav.oGetUserMedia !== void 0,
|
|
258
|
+
ms: nav.msGetUserMedia !== void 0
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
getMaxTouchPoints() {
|
|
262
|
+
if (typeof navigator === "undefined") return 0;
|
|
263
|
+
return navigator.maxTouchPoints;
|
|
264
|
+
}
|
|
265
|
+
hasOnTouchStart() {
|
|
266
|
+
if (typeof window !== "undefined" && "ontouchstart" in window) return true;
|
|
267
|
+
if (typeof document !== "undefined") return "ontouchstart" in document.documentElement;
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
getNavigatorProductSub() {
|
|
271
|
+
if (typeof navigator === "undefined") return;
|
|
272
|
+
return navigator.productSub;
|
|
273
|
+
}
|
|
274
|
+
getEvalToStringLength() {
|
|
275
|
+
return eval.toString().length;
|
|
276
|
+
}
|
|
277
|
+
tryFirefoxToSource() {
|
|
278
|
+
try {
|
|
279
|
+
throw "a";
|
|
280
|
+
} catch (err) {
|
|
281
|
+
try {
|
|
282
|
+
err.toSource();
|
|
283
|
+
return true;
|
|
284
|
+
} catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async fetchJson(url, timeoutMs = 3e3) {
|
|
290
|
+
try {
|
|
291
|
+
if (typeof fetch === "undefined") return null;
|
|
292
|
+
const controller = new AbortController();
|
|
293
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
294
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
295
|
+
clearTimeout(timeoutId);
|
|
296
|
+
return await response.json();
|
|
297
|
+
} catch {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async enumerateVideoDeviceLabels() {
|
|
302
|
+
try {
|
|
303
|
+
if (typeof navigator === "undefined" || !navigator.mediaDevices?.enumerateDevices) return [];
|
|
304
|
+
return (await navigator.mediaDevices.enumerateDevices()).filter((device) => device.kind === "videoinput").map((device) => device.label);
|
|
305
|
+
} catch {
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
getTimestamp() {
|
|
310
|
+
return Date.now();
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
//#endregion
|
|
314
|
+
//#region ../infra/src/providers/browser/BrowserInfoProvider.ts
|
|
315
|
+
var BrowserInfoProvider = class {
|
|
316
|
+
checkWebRtcSupport() {
|
|
317
|
+
if (typeof window === "undefined") return false;
|
|
318
|
+
const hasRTCPeerConnection = "RTCPeerConnection" in window || "webkitRTCPeerConnection" in window || "mozRTCPeerConnection" in window;
|
|
319
|
+
const hasGetUserMedia = typeof navigator !== "undefined" && navigator.mediaDevices?.getUserMedia !== void 0;
|
|
320
|
+
return hasRTCPeerConnection && hasGetUserMedia;
|
|
321
|
+
}
|
|
322
|
+
getBrowserInfo() {
|
|
323
|
+
const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
|
|
324
|
+
return {
|
|
325
|
+
userAgent,
|
|
326
|
+
isWebRtcSupported: this.checkWebRtcSupport(),
|
|
327
|
+
...getParsedUserAgent(userAgent)
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
//#endregion
|
|
332
|
+
//#region ../infra/src/device/getDeviceData.ts
|
|
333
|
+
const HIGH_ENTROPY_HINTS = /* @__PURE__ */ new Set([
|
|
334
|
+
"model",
|
|
335
|
+
"platformVersion",
|
|
336
|
+
"fullVersionList",
|
|
337
|
+
"brands",
|
|
338
|
+
"platform"
|
|
339
|
+
]);
|
|
340
|
+
function getFallbackDeviceInfo() {
|
|
341
|
+
const parsed = getParsedUserAgent();
|
|
342
|
+
return {
|
|
343
|
+
device: { model: parsed.device.model },
|
|
344
|
+
os: {
|
|
345
|
+
name: parsed.os.name,
|
|
346
|
+
version: parsed.os.version
|
|
347
|
+
},
|
|
348
|
+
browser: {
|
|
349
|
+
name: parsed.browser.name,
|
|
350
|
+
version: parsed.browser.version
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function sanitizeString(value) {
|
|
355
|
+
return value?.trim() || void 0;
|
|
356
|
+
}
|
|
357
|
+
function extractPrimaryBrandInfo(fullVersionList, brands) {
|
|
358
|
+
const primaryBrand = fullVersionList?.[0] || brands?.[0];
|
|
359
|
+
return {
|
|
360
|
+
name: sanitizeString(primaryBrand?.brand),
|
|
361
|
+
version: sanitizeString(primaryBrand?.version)
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
async function getHighEntropyDeviceInfo(userAgentData) {
|
|
365
|
+
const highEntropyValues = await userAgentData.getHighEntropyValues(Array.from(HIGH_ENTROPY_HINTS));
|
|
366
|
+
const { name: browserName, version: browserVersion } = extractPrimaryBrandInfo(highEntropyValues.fullVersionList, userAgentData.brands);
|
|
367
|
+
return {
|
|
368
|
+
device: { model: sanitizeString(highEntropyValues.model) },
|
|
369
|
+
os: {
|
|
370
|
+
name: sanitizeString(highEntropyValues.platform),
|
|
371
|
+
version: sanitizeString(highEntropyValues.platformVersion)
|
|
372
|
+
},
|
|
373
|
+
browser: {
|
|
374
|
+
name: browserName,
|
|
375
|
+
version: browserVersion
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
const checkForUnbrandedBrowser = (browser) => {
|
|
380
|
+
const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
|
|
381
|
+
const fallback = getFallbackDeviceInfo();
|
|
382
|
+
if (!userAgent) return browser;
|
|
383
|
+
try {
|
|
384
|
+
return {
|
|
385
|
+
...browser,
|
|
386
|
+
name: fallback.browser.name,
|
|
387
|
+
version: fallback.browser.version
|
|
388
|
+
};
|
|
389
|
+
} catch {
|
|
390
|
+
return {
|
|
391
|
+
...browser,
|
|
392
|
+
name: "Unknown",
|
|
393
|
+
version: "Unknown"
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
function mergeDeviceInfo(fallback, enhanced) {
|
|
398
|
+
return {
|
|
399
|
+
device: { model: enhanced.device?.model || fallback.device.model },
|
|
400
|
+
os: {
|
|
401
|
+
name: enhanced.os?.name || fallback.os.name,
|
|
402
|
+
version: enhanced.os?.version || fallback.os.version
|
|
403
|
+
},
|
|
404
|
+
browser: checkForUnbrandedBrowser({
|
|
405
|
+
name: enhanced.browser?.name || fallback.browser.name,
|
|
406
|
+
version: enhanced.browser?.version || fallback.browser.version
|
|
407
|
+
})
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
function isUserAgentClientHintsSupported(navigator) {
|
|
411
|
+
return Boolean(navigator.userAgentData?.getHighEntropyValues && typeof navigator.userAgentData.getHighEntropyValues === "function");
|
|
412
|
+
}
|
|
413
|
+
async function getDeviceFingerprintInfo() {
|
|
414
|
+
if (typeof navigator === "undefined") return {
|
|
415
|
+
device: {},
|
|
416
|
+
os: {},
|
|
417
|
+
browser: {}
|
|
418
|
+
};
|
|
419
|
+
const customNavigator = navigator;
|
|
420
|
+
const fallbackInfo = getFallbackDeviceInfo();
|
|
421
|
+
if (!isUserAgentClientHintsSupported(customNavigator)) return fallbackInfo;
|
|
422
|
+
try {
|
|
423
|
+
return mergeDeviceInfo(fallbackInfo, await getHighEntropyDeviceInfo(customNavigator.userAgentData));
|
|
424
|
+
} catch {
|
|
425
|
+
return fallbackInfo;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//#endregion
|
|
429
|
+
//#region ../infra/src/scheduling/yieldUntilNextPaint.ts
|
|
430
|
+
/**
|
|
431
|
+
* Resolves after the browser has had a chance to commit and paint a queued
|
|
432
|
+
* render.
|
|
433
|
+
*
|
|
434
|
+
* Strategy:
|
|
435
|
+
* - `requestAnimationFrame` callbacks fire BEFORE the paint of the frame
|
|
436
|
+
* they belong to (per the HTML5 "update the rendering" step). If we
|
|
437
|
+
* resolve the promise inside a rAF callback, the await-continuation
|
|
438
|
+
* runs as a microtask immediately after the callback returns — still
|
|
439
|
+
* before the paint phase of that frame. A caller that then blocks the
|
|
440
|
+
* main thread (e.g. synchronous WASM `processPhoto`) starves the paint.
|
|
441
|
+
* - We therefore chain rAF → setTimeout: the rAF fires before frame N's
|
|
442
|
+
* paint, the setTimeout runs as a macrotask scheduled after frame N's
|
|
443
|
+
* "update the rendering" step, which the browser will only get to once
|
|
444
|
+
* the paint actually lands. By the time setTimeout fires, the paint
|
|
445
|
+
* for the queued render is on screen.
|
|
446
|
+
* - In environments where rAF never ticks (jsdom, happy-dom, backgrounded
|
|
447
|
+
* tabs), a parallel `setTimeout` fallback at 100 ms resolves instead.
|
|
448
|
+
* 100 ms is comfortably longer than two real-browser frames so rAF +
|
|
449
|
+
* setTimeout wins reliably in any foregrounded browser. (An earlier
|
|
450
|
+
* implementation raced rAF against a `MessageChannel` macrotask, but
|
|
451
|
+
* MessageChannel drains immediately after the current task's
|
|
452
|
+
* microtasks — before the next paint — so it resolved the promise too
|
|
453
|
+
* early and defeated the whole point of the helper.)
|
|
454
|
+
*
|
|
455
|
+
* Lives in infra because it touches browser APIs (`requestAnimationFrame`,
|
|
456
|
+
* `setTimeout`) that the architecture rules forbid from core. Core modules
|
|
457
|
+
* that need to yield to the browser render loop should import this helper
|
|
458
|
+
* directly via its file path.
|
|
459
|
+
*/
|
|
460
|
+
function yieldUntilNextPaint() {
|
|
461
|
+
return new Promise((resolve) => {
|
|
462
|
+
let resolved = false;
|
|
463
|
+
const done = () => {
|
|
464
|
+
if (resolved) return;
|
|
465
|
+
resolved = true;
|
|
466
|
+
resolve();
|
|
467
|
+
};
|
|
468
|
+
if (typeof requestAnimationFrame === "function") requestAnimationFrame(() => {
|
|
469
|
+
requestAnimationFrame(() => {
|
|
470
|
+
setTimeout(done, 0);
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
setTimeout(done, 100);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
//#endregion
|
|
477
|
+
//#region ../infra/src/providers/browser/thumbmarkAdapter.ts
|
|
478
|
+
/**
|
|
479
|
+
* Adapter for @thumbmarkjs/thumbmarkjs. Single point of dependency so bundlers
|
|
480
|
+
* resolve it from infra's node_modules when building apps that depend on core → infra.
|
|
481
|
+
*/
|
|
482
|
+
const THUMBMARK_ALGORITHM = {
|
|
483
|
+
algorithmName: "thumbmarkjs",
|
|
484
|
+
algorithmVersion: "1.6.4"
|
|
485
|
+
};
|
|
486
|
+
/**
|
|
487
|
+
* `logging` must stay disabled. With it on (the upstream default) `getThumbmark()`
|
|
488
|
+
* evaluates a bare, unguarded storage read:
|
|
489
|
+
*
|
|
490
|
+
* options.logging && !sessionStorage.getItem("_tmjs_l") && Math.random() < 1e-4
|
|
491
|
+
*
|
|
492
|
+
* Hosts that delete the bare global as a self-XSS mitigation (`delete
|
|
493
|
+
* window.sessionStorage`) make that a `ReferenceError`, which would cost us the
|
|
494
|
+
* device fingerprint. `logging: false` short-circuits the expression before the
|
|
495
|
+
* read. It also stops upstream's 1-in-10 000 telemetry POST to
|
|
496
|
+
* api.thumbmarkjs.com. Re-check this when bumping the dependency.
|
|
497
|
+
*/
|
|
498
|
+
const THUMBMARK_OPTIONS = {
|
|
499
|
+
logging: false,
|
|
500
|
+
yield: yieldUntilNextPaint
|
|
501
|
+
};
|
|
502
|
+
const lazyThumbmark = BrowserLazyImportProvider.getInstance().create(() => import("./thumbmark.esm-CRc0cYvz.esm.js"), {
|
|
503
|
+
label: "Fingerprint",
|
|
504
|
+
moduleName: "@thumbmarkjs/thumbmarkjs",
|
|
505
|
+
timeoutMs: 1e4,
|
|
506
|
+
disabledMessage: "the device fingerprint is unavailable for this attempt."
|
|
507
|
+
});
|
|
508
|
+
async function getThumbmarkId() {
|
|
509
|
+
const module = await lazyThumbmark.load();
|
|
510
|
+
if (!module) throw new Error("@thumbmarkjs/thumbmarkjs failed to load");
|
|
511
|
+
return (await new module.Thumbmark(THUMBMARK_OPTIONS).get()).thumbmark;
|
|
512
|
+
}
|
|
513
|
+
//#endregion
|
|
514
|
+
//#region ../infra/src/providers/browser/FingerprintProvider.ts
|
|
515
|
+
var FingerprintProvider = class {
|
|
516
|
+
constructor(ipLookup) {
|
|
517
|
+
this.ipLookup = ipLookup;
|
|
518
|
+
}
|
|
519
|
+
prime() {
|
|
520
|
+
this.startVisitorId();
|
|
521
|
+
}
|
|
522
|
+
startVisitorId() {
|
|
523
|
+
if (!this.visitorIdPromise) {
|
|
524
|
+
this.visitorIdPromise = getThumbmarkId();
|
|
525
|
+
this.visitorIdPromise.catch(() => void 0);
|
|
526
|
+
}
|
|
527
|
+
return this.visitorIdPromise;
|
|
528
|
+
}
|
|
529
|
+
async getFingerprint(disableIpify = false) {
|
|
530
|
+
const visitorId = await this.startVisitorId();
|
|
531
|
+
const [deviceInfo, ip] = await Promise.all([getDeviceFingerprintInfo(), disableIpify ? Promise.resolve("") : this.ipLookup.getIp()]);
|
|
532
|
+
return {
|
|
533
|
+
visitorId,
|
|
534
|
+
ip,
|
|
535
|
+
deviceInfo,
|
|
536
|
+
...THUMBMARK_ALGORITHM
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
//#endregion
|
|
541
|
+
//#region ../infra/src/providers/browser/IpifyProvider.ts
|
|
542
|
+
let cachedIp;
|
|
543
|
+
let inFlightLookup;
|
|
544
|
+
/**
|
|
545
|
+
* Resets the module-level IP cache. Intended for tests and full session resets.
|
|
546
|
+
*/
|
|
547
|
+
function resetIpifyCache() {
|
|
548
|
+
cachedIp = void 0;
|
|
549
|
+
inFlightLookup = void 0;
|
|
550
|
+
}
|
|
551
|
+
async function fetchIpFromIpify() {
|
|
552
|
+
if (typeof fetch === "undefined") return "";
|
|
553
|
+
let timeoutId = 0;
|
|
554
|
+
const controller = new AbortController();
|
|
555
|
+
if (AbortSignal.timeout) {
|
|
556
|
+
const signal = AbortSignal.timeout(3e3);
|
|
557
|
+
return (await (await fetch("https://api.ipify.org?format=json", { signal })).json()).ip;
|
|
558
|
+
}
|
|
559
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
560
|
+
timeoutId = setTimeout(() => {
|
|
561
|
+
controller.abort();
|
|
562
|
+
reject(/* @__PURE__ */ new Error("Request timeout"));
|
|
563
|
+
}, 3e3);
|
|
564
|
+
});
|
|
565
|
+
const fetchPromise = fetch("https://api.ipify.org?format=json", { signal: controller.signal }).then((res) => res.json()).then((data) => data.ip);
|
|
566
|
+
const result = await Promise.race([fetchPromise, timeoutPromise]);
|
|
567
|
+
clearTimeout(timeoutId);
|
|
568
|
+
return result;
|
|
569
|
+
}
|
|
570
|
+
var IpifyProvider = class {
|
|
571
|
+
async getIp() {
|
|
572
|
+
if (cachedIp !== void 0) return cachedIp;
|
|
573
|
+
if (inFlightLookup) return inFlightLookup;
|
|
574
|
+
inFlightLookup = (async () => {
|
|
575
|
+
try {
|
|
576
|
+
const ip = await fetchIpFromIpify();
|
|
577
|
+
cachedIp = ip;
|
|
578
|
+
return ip;
|
|
579
|
+
} catch {
|
|
580
|
+
cachedIp = "";
|
|
581
|
+
return "";
|
|
582
|
+
} finally {
|
|
583
|
+
inFlightLookup = void 0;
|
|
584
|
+
}
|
|
585
|
+
})();
|
|
586
|
+
return inFlightLookup;
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
//#endregion
|
|
590
|
+
//#region src/internal/fingerprint/fingerprintApi.ts
|
|
591
|
+
async function getFingerprint(disableIpify) {
|
|
592
|
+
const shouldDisableIpify = disableIpify ?? getDisableIpify();
|
|
593
|
+
return new FingerprintProvider(new IpifyProvider()).getFingerprint(shouldDisableIpify);
|
|
594
|
+
}
|
|
595
|
+
//#endregion
|
|
596
|
+
//#region src/internal/device/hasLiedBrowser.ts
|
|
597
|
+
function detectBrowserFromUserAgent(userAgent) {
|
|
598
|
+
if (userAgent.indexOf("edge/") >= 0 || userAgent.indexOf("iemobile/") >= 0) return "Other";
|
|
599
|
+
if (userAgent.indexOf("opera mini") >= 0) return "Other";
|
|
600
|
+
if (userAgent.indexOf("firefox/") >= 0) return "Firefox";
|
|
601
|
+
if (userAgent.indexOf("opera/") >= 0 || userAgent.indexOf(" opr/") >= 0) return "Opera";
|
|
602
|
+
if (userAgent.indexOf("chrome/") >= 0) return "Chrome";
|
|
603
|
+
if (userAgent.indexOf("safari/") >= 0) {
|
|
604
|
+
if (userAgent.indexOf("android 1.") >= 0 || userAgent.indexOf("android 2.") >= 0 || userAgent.indexOf("android 3.") >= 0 || userAgent.indexOf("android 4.") >= 0) return "AOSP";
|
|
605
|
+
return "Safari";
|
|
606
|
+
}
|
|
607
|
+
if (userAgent.indexOf("trident/") >= 0) return "Internet Explorer";
|
|
608
|
+
return "Other";
|
|
609
|
+
}
|
|
610
|
+
function hasLiedBrowser(browserEnv) {
|
|
611
|
+
const userAgent = getUserAgent().toLowerCase();
|
|
612
|
+
if (userAgent.indexOf("edge/") >= 0 || userAgent.indexOf("iemobile/") >= 0) return false;
|
|
613
|
+
if (userAgent.indexOf("opera mini") >= 0) return false;
|
|
614
|
+
const browser = detectBrowserFromUserAgent(userAgent);
|
|
615
|
+
const productSub = browserEnv.getNavigatorProductSub();
|
|
616
|
+
if ((browser === "Chrome" || browser === "Safari" || browser === "Opera") && productSub !== "20030107") return true;
|
|
617
|
+
const evalLength = browserEnv.getEvalToStringLength();
|
|
618
|
+
if (evalLength === 37 && browser !== "Safari" && browser !== "Firefox" && browser !== "Other") return true;
|
|
619
|
+
if (evalLength === 39 && browser !== "Internet Explorer" && browser !== "Other") return true;
|
|
620
|
+
if (evalLength === 33 && browser !== "Chrome" && browser !== "AOSP" && browser !== "Opera" && browser !== "Other") return true;
|
|
621
|
+
return browserEnv.tryFirefoxToSource() && browser !== "Firefox" && browser !== "Other";
|
|
622
|
+
}
|
|
623
|
+
//#endregion
|
|
624
|
+
//#region src/internal/device/browserSimulation.ts
|
|
625
|
+
const AUTOMATION_MARKERS = {
|
|
626
|
+
window: [
|
|
627
|
+
"callPhantom",
|
|
628
|
+
"_phantom",
|
|
629
|
+
"phantom",
|
|
630
|
+
"__nightmare",
|
|
631
|
+
"domAutomation",
|
|
632
|
+
"domAutomationController"
|
|
633
|
+
],
|
|
634
|
+
navigator: ["webdriver"]
|
|
635
|
+
};
|
|
636
|
+
function hasAutomationMarker(browserEnv) {
|
|
637
|
+
for (const prop of AUTOMATION_MARKERS.window) if (browserEnv.getWindowProperty(prop)) return true;
|
|
638
|
+
for (const prop of AUTOMATION_MARKERS.navigator) if (browserEnv.getNavigatorProperty(prop)) return true;
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
function isBrowserSimulation(browserEnv) {
|
|
642
|
+
if (hasAutomationMarker(browserEnv)) return true;
|
|
643
|
+
if (!getParsedUserAgent().browser.name) return true;
|
|
644
|
+
const touchPoints = browserEnv.getMaxTouchPoints();
|
|
645
|
+
const isTouch = touchPoints > 0 || browserEnv.hasOnTouchStart();
|
|
646
|
+
if (isTouch && touchPoints !== 1) return false;
|
|
647
|
+
const ua = getUserAgent();
|
|
648
|
+
if (isTouch && (hasLiedBrowser(browserEnv) || ua.includes("Mobile"))) return true;
|
|
649
|
+
if (isIOS(ua) && !browserEnv.hasOnTouchStart()) return true;
|
|
650
|
+
return false;
|
|
651
|
+
}
|
|
652
|
+
//#endregion
|
|
653
|
+
//#region src/internal/fingerprint/fingerprintService.ts
|
|
654
|
+
function formatOsVersion(os) {
|
|
655
|
+
return `${os.name || "Unknown"} ${os.version || ""}`.trim();
|
|
656
|
+
}
|
|
657
|
+
function formatBrowser(browser) {
|
|
658
|
+
if (!browser.name || !browser.version) return "Unknown";
|
|
659
|
+
return `${browser.name} ${browser.version}`;
|
|
660
|
+
}
|
|
661
|
+
async function submitDeviceFingerprint(options = {}, dependencies) {
|
|
662
|
+
const { disableIpify = false, hostingApp, signal } = options;
|
|
663
|
+
const token = getToken();
|
|
664
|
+
const fingerprint = await dependencies.fingerprintProvider.getFingerprint(disableIpify);
|
|
665
|
+
if (getToken() !== token || dependencies.isCurrentSession?.() === false) throw new Error("Session changed during fingerprint collection");
|
|
666
|
+
const hasLiedBrowser = isBrowserSimulation(dependencies.browserEnv);
|
|
667
|
+
const payload = {
|
|
668
|
+
hash: fingerprint.visitorId || "",
|
|
669
|
+
ip: fingerprint.ip || "",
|
|
670
|
+
deviceType: "WEBAPP",
|
|
671
|
+
data: JSON.stringify(fingerprint),
|
|
672
|
+
osVersion: formatOsVersion(fingerprint.deviceInfo.os),
|
|
673
|
+
deviceModel: fingerprint.deviceInfo.device.model || "",
|
|
674
|
+
browser: formatBrowser(fingerprint.deviceInfo.browser),
|
|
675
|
+
hasLiedBrowser,
|
|
676
|
+
sdkVersion: SDK_VERSION,
|
|
677
|
+
hostingApp: hostingApp ?? "Web SDK",
|
|
678
|
+
algorithmName: fingerprint.algorithmName,
|
|
679
|
+
algorithmVersion: fingerprint.algorithmVersion
|
|
680
|
+
};
|
|
681
|
+
const response = await api.post(endpoints.deviceFingerprint, payload, { signal });
|
|
682
|
+
if (!response.ok) throw new Error(`Failed to submit fingerprint: ${response.status} ${response.statusText}`);
|
|
683
|
+
return response.data;
|
|
684
|
+
}
|
|
685
|
+
//#endregion
|
|
686
|
+
//#region src/internal/session/standaloneFlowPolicy.ts
|
|
687
|
+
let standaloneFlowPolicy = Object.freeze({
|
|
688
|
+
enabled: true,
|
|
689
|
+
mergeConfig: false
|
|
690
|
+
});
|
|
691
|
+
let flowPreloader;
|
|
692
|
+
function resolveStandaloneFlowPolicy(flow) {
|
|
693
|
+
return Object.freeze({
|
|
694
|
+
enabled: flow !== false,
|
|
695
|
+
mergeConfig: flow !== false && (typeof flow === "object" ? flow : {}).mergeConfig === true
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
function setStandaloneFlowPolicy(policy) {
|
|
699
|
+
standaloneFlowPolicy = policy;
|
|
700
|
+
}
|
|
701
|
+
function getStandaloneFlowPolicy() {
|
|
702
|
+
return standaloneFlowPolicy;
|
|
703
|
+
}
|
|
704
|
+
function registerFlowPreloader(preloader) {
|
|
705
|
+
flowPreloader = preloader;
|
|
706
|
+
}
|
|
707
|
+
function preloadSessionFlow() {
|
|
708
|
+
return flowPreloader?.() ?? Promise.resolve();
|
|
709
|
+
}
|
|
710
|
+
function resetStandaloneFlowPolicy() {
|
|
711
|
+
standaloneFlowPolicy = resolveStandaloneFlowPolicy(void 0);
|
|
712
|
+
flowPreloader = void 0;
|
|
713
|
+
}
|
|
714
|
+
//#endregion
|
|
715
|
+
//#region src/internal/session/sessionInitializer.ts
|
|
716
|
+
let sessionInitialized = false;
|
|
717
|
+
let cachedFeatures = null;
|
|
718
|
+
let cachedDisableIpify = false;
|
|
719
|
+
let clientIpLookupEnabled = true;
|
|
720
|
+
let clientFingerprintEnabled = true;
|
|
721
|
+
let clientHostingApp;
|
|
722
|
+
function setClientIpLookupEnabled(enabled) {
|
|
723
|
+
clientIpLookupEnabled = enabled;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Host identifier from `setup({ hostingApp })`, used as the default for every
|
|
727
|
+
* activation. Without it the option only reached the fingerprint when the host
|
|
728
|
+
* also passed `token` to `setup()` — activations triggered later from inside
|
|
729
|
+
* `<incode-flow>` / `<incode-workflow>` / standalone modules carry a token but
|
|
730
|
+
* no host identity, so those sessions fell back to the `'Web SDK'` default.
|
|
731
|
+
*/
|
|
732
|
+
function setClientHostingApp(hostingApp) {
|
|
733
|
+
clientHostingApp = hostingApp;
|
|
734
|
+
}
|
|
735
|
+
function setClientFingerprintEnabled(enabled) {
|
|
736
|
+
clientFingerprintEnabled = enabled;
|
|
737
|
+
fingerprintSignalsReporter.setEnabled(enabled);
|
|
738
|
+
}
|
|
739
|
+
function resolveDisableIpify(serverDisableIpify) {
|
|
740
|
+
return !clientIpLookupEnabled || serverDisableIpify;
|
|
741
|
+
}
|
|
742
|
+
/** `"Chrome" + "126"` -> `"Chrome 126"`; undefined when nothing was parsed. */
|
|
743
|
+
function composeNameVersion(name, version) {
|
|
744
|
+
const value = [name, version].filter(Boolean).join(" ");
|
|
745
|
+
return value === "" ? void 0 : value;
|
|
746
|
+
}
|
|
747
|
+
function preloadOptionalFlow() {
|
|
748
|
+
try {
|
|
749
|
+
return preloadSessionFlow().catch(() => void 0);
|
|
750
|
+
} catch {
|
|
751
|
+
return Promise.resolve();
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
let cachedFingerprintSuccess = false;
|
|
755
|
+
let cachedFingerprintResult;
|
|
756
|
+
let sessionInitPromise = null;
|
|
757
|
+
let fingerprintSettled = null;
|
|
758
|
+
function createFingerprintSettled() {
|
|
759
|
+
let resolve = () => void 0;
|
|
760
|
+
return {
|
|
761
|
+
promise: new Promise((r) => {
|
|
762
|
+
resolve = r;
|
|
763
|
+
}),
|
|
764
|
+
resolve
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Resolves once the device-fingerprint step of the current session
|
|
769
|
+
* activation has settled (submitted, failed, or skipped) — with the backend's
|
|
770
|
+
* result when there is one. Resolves immediately when no activation is in
|
|
771
|
+
* flight. Pairs with `initializeSession({ awaitFingerprint: false })`.
|
|
772
|
+
*/
|
|
773
|
+
function whenSessionFingerprintSettled() {
|
|
774
|
+
return fingerprintSettled?.promise ?? Promise.resolve(cachedFingerprintResult);
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Activates a session by setting the auth token on the HTTP client and
|
|
778
|
+
* preloading session-scoped state.
|
|
779
|
+
*
|
|
780
|
+
* Performs:
|
|
781
|
+
* 1. Sets the token (and clears stale session-init cache if the token changed)
|
|
782
|
+
* 2. Links the session with the TRI activity if TRI is enabled
|
|
783
|
+
* 3. Fetches feature configuration from backend
|
|
784
|
+
* 4. Submits device fingerprint
|
|
785
|
+
* 5. Starts the analytics batcher so buffered events are flushed
|
|
786
|
+
*
|
|
787
|
+
* Results are cached per token. Calling again with the same token returns the
|
|
788
|
+
* cached result; calling with a different token re-initializes from scratch.
|
|
789
|
+
*
|
|
790
|
+
* @param options - Session activation options (`token` required)
|
|
791
|
+
* @returns Session initialization result with feature config
|
|
792
|
+
*
|
|
793
|
+
* @example
|
|
794
|
+
* ```ts
|
|
795
|
+
* await setup({ apiURL: 'https://api.incode.com' });
|
|
796
|
+
* const session = await createSession('api-key', options);
|
|
797
|
+
* const { features } = await initializeSession({ token: session.token });
|
|
798
|
+
*
|
|
799
|
+
* // Check feature flags
|
|
800
|
+
* if (isFeatureEnabled('DISABLE_IPIFY', features.features)) {
|
|
801
|
+
* // Handle disabled ipify
|
|
802
|
+
* }
|
|
803
|
+
* ```
|
|
804
|
+
*/
|
|
805
|
+
async function initializeSession(options = {}) {
|
|
806
|
+
const { token, hostingApp = clientHostingApp, signal, preloadFlow, awaitFingerprint = true } = options;
|
|
807
|
+
let triLinkPromise = Promise.resolve();
|
|
808
|
+
if (token !== void 0 && token !== getToken()) {
|
|
809
|
+
setToken(token);
|
|
810
|
+
resetSessionInit();
|
|
811
|
+
if (isTRIStarted()) triLinkPromise = linkSessionWithTRI(token);
|
|
812
|
+
}
|
|
813
|
+
if (token !== void 0) noteTokenActivated();
|
|
814
|
+
if (getToken()) fingerprintSignalsReporter.onTokenAvailable();
|
|
815
|
+
const flowPreloadPromise = getToken() && preloadFlow === true ? preloadOptionalFlow() : Promise.resolve();
|
|
816
|
+
await triLinkPromise;
|
|
817
|
+
if (sessionInitialized && cachedFeatures) {
|
|
818
|
+
if (awaitFingerprint) await whenSessionFingerprintSettled();
|
|
819
|
+
await flowPreloadPromise;
|
|
820
|
+
return {
|
|
821
|
+
features: cachedFeatures,
|
|
822
|
+
disableIpify: cachedDisableIpify,
|
|
823
|
+
fingerprintSuccess: cachedFingerprintSuccess,
|
|
824
|
+
fingerprintResult: cachedFingerprintResult
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
if (sessionInitPromise) {
|
|
828
|
+
const result = await sessionInitPromise;
|
|
829
|
+
if (awaitFingerprint) await whenSessionFingerprintSettled();
|
|
830
|
+
await flowPreloadPromise;
|
|
831
|
+
return {
|
|
832
|
+
...result,
|
|
833
|
+
fingerprintSuccess: cachedFingerprintSuccess,
|
|
834
|
+
fingerprintResult: cachedFingerprintResult
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
const settled = createFingerprintSettled();
|
|
838
|
+
fingerprintSettled = settled;
|
|
839
|
+
const fingerprintProvider = clientFingerprintEnabled ? new FingerprintProvider(new IpifyProvider()) : void 0;
|
|
840
|
+
fingerprintProvider?.prime?.();
|
|
841
|
+
let fingerprintPromise;
|
|
842
|
+
sessionInitPromise = (async () => {
|
|
843
|
+
let features;
|
|
844
|
+
let serverDisableIpify = false;
|
|
845
|
+
try {
|
|
846
|
+
features = await fetchFeatureConfig(signal);
|
|
847
|
+
serverDisableIpify = isFeatureEnabled("DISABLE_IPIFY", features.features);
|
|
848
|
+
startTrueSightCollection(features);
|
|
849
|
+
} catch {
|
|
850
|
+
features = { sessionIdentifier: "" };
|
|
851
|
+
trueSightLog("warning", "session", "orchestration", "feature-config fetch failed");
|
|
852
|
+
startTrueSightCollection();
|
|
853
|
+
}
|
|
854
|
+
const disableIpify = resolveDisableIpify(serverDisableIpify);
|
|
855
|
+
const preloadedFlow = await flowPreloadPromise;
|
|
856
|
+
await updateFeatureManagementUser({ customIDs: {
|
|
857
|
+
hashed_onboarding_id: features.sessionIdentifier || void 0,
|
|
858
|
+
flow_id: preloadedFlow?.flowId
|
|
859
|
+
} });
|
|
860
|
+
fingerprintPromise = submitSessionFingerprint(fingerprintProvider, {
|
|
861
|
+
disableIpify,
|
|
862
|
+
hostingApp,
|
|
863
|
+
signal
|
|
864
|
+
}, settled);
|
|
865
|
+
try {
|
|
866
|
+
const browserInfo = new BrowserInfoProvider().getBrowserInfo();
|
|
867
|
+
const language = new BrowserEnvironmentProvider().getNavigatorProperty("language");
|
|
868
|
+
noteEnvironment({
|
|
869
|
+
browser: composeNameVersion(browserInfo.browser.name, browserInfo.browser.version),
|
|
870
|
+
osVersion: composeNameVersion(browserInfo.os.name, browserInfo.os.version),
|
|
871
|
+
osLanguage: typeof language === "string" ? language : void 0
|
|
872
|
+
});
|
|
873
|
+
addEvent({
|
|
874
|
+
code: "browser",
|
|
875
|
+
payload: {
|
|
876
|
+
userAgent: browserInfo.userAgent,
|
|
877
|
+
isWebRtcSupported: browserInfo.isWebRtcSupported,
|
|
878
|
+
browser: browserInfo.browser,
|
|
879
|
+
os: browserInfo.os,
|
|
880
|
+
device: browserInfo.device,
|
|
881
|
+
engine: browserInfo.engine,
|
|
882
|
+
cpu: browserInfo.cpu
|
|
883
|
+
}
|
|
884
|
+
});
|
|
885
|
+
} catch (error) {
|
|
886
|
+
console.warn("Failed to send browser info event:", error);
|
|
887
|
+
}
|
|
888
|
+
if (awaitFingerprint) await fingerprintPromise;
|
|
889
|
+
sessionInitialized = true;
|
|
890
|
+
cachedFeatures = features;
|
|
891
|
+
cachedDisableIpify = disableIpify;
|
|
892
|
+
fingerprintSignalsReporter.onSessionActivated();
|
|
893
|
+
await flowPreloadPromise;
|
|
894
|
+
return {
|
|
895
|
+
features,
|
|
896
|
+
disableIpify,
|
|
897
|
+
fingerprintSuccess: cachedFingerprintSuccess,
|
|
898
|
+
fingerprintResult: cachedFingerprintResult
|
|
899
|
+
};
|
|
900
|
+
})().finally(() => {
|
|
901
|
+
sessionInitPromise = null;
|
|
902
|
+
if (!fingerprintPromise) settled.resolve(void 0);
|
|
903
|
+
(fingerprintPromise ?? Promise.resolve()).finally(() => {
|
|
904
|
+
if (fingerprintSettled === settled) getAnalyticsBatcher()?.start();
|
|
905
|
+
});
|
|
906
|
+
});
|
|
907
|
+
return sessionInitPromise;
|
|
908
|
+
}
|
|
909
|
+
/**
|
|
910
|
+
* Device-fingerprint step of session activation. Writes the cached result only
|
|
911
|
+
* while it still belongs to the current activation (a token change resets
|
|
912
|
+
* `fingerprintSettled`) and always settles the waiter.
|
|
913
|
+
*/
|
|
914
|
+
async function submitSessionFingerprint(fingerprintProvider, options, settled) {
|
|
915
|
+
const isCurrent = () => fingerprintSettled === settled;
|
|
916
|
+
try {
|
|
917
|
+
if (fingerprintProvider) try {
|
|
918
|
+
const result = await submitDeviceFingerprint(options, {
|
|
919
|
+
fingerprintProvider,
|
|
920
|
+
browserEnv: new BrowserEnvironmentProvider(),
|
|
921
|
+
isCurrentSession: isCurrent
|
|
922
|
+
});
|
|
923
|
+
if (isCurrent()) {
|
|
924
|
+
cachedFingerprintResult = result;
|
|
925
|
+
cachedFingerprintSuccess = true;
|
|
926
|
+
flushDeviceStatsQueue();
|
|
927
|
+
}
|
|
928
|
+
} catch (error) {
|
|
929
|
+
console.warn("Failed to submit device fingerprint:", error);
|
|
930
|
+
trueSightLog("warning", "session", "other", "device fingerprint submit failed");
|
|
931
|
+
}
|
|
932
|
+
else if (isCurrent()) flushDeviceStatsQueue();
|
|
933
|
+
} finally {
|
|
934
|
+
settled.resolve(isCurrent() ? cachedFingerprintResult : void 0);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Gets the cached disableIpify flag.
|
|
939
|
+
* Returns false if session hasn't been initialized.
|
|
940
|
+
*/
|
|
941
|
+
function getDisableIpify() {
|
|
942
|
+
if (!clientIpLookupEnabled) return true;
|
|
943
|
+
return cachedDisableIpify;
|
|
944
|
+
}
|
|
945
|
+
function getSessionFingerprintResult() {
|
|
946
|
+
return cachedFingerprintResult;
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Gets whether client-side device-fingerprint submission is enabled.
|
|
950
|
+
* Consumed by `loadDeepsightSession` to resolve `disableFingerprint`
|
|
951
|
+
* (mirrors how `getDisableIpify` is used).
|
|
952
|
+
*/
|
|
953
|
+
function getFingerprintEnabled() {
|
|
954
|
+
return clientFingerprintEnabled;
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Resets session initialization state.
|
|
958
|
+
* Useful for testing or when starting a new session.
|
|
959
|
+
*/
|
|
960
|
+
function resetSessionInit() {
|
|
961
|
+
fingerprintSignalsReporter.resetSession();
|
|
962
|
+
sessionInitialized = false;
|
|
963
|
+
cachedFeatures = null;
|
|
964
|
+
cachedDisableIpify = false;
|
|
965
|
+
cachedFingerprintSuccess = false;
|
|
966
|
+
cachedFingerprintResult = void 0;
|
|
967
|
+
sessionInitPromise = null;
|
|
968
|
+
fingerprintSettled = null;
|
|
969
|
+
resetFeatureConfigCache();
|
|
970
|
+
resetIpifyCache();
|
|
971
|
+
resetDeviceStatsQueue();
|
|
972
|
+
}
|
|
973
|
+
//#endregion
|
|
974
|
+
export { IpifyProvider as _, resetSessionInit as a, BrowserEnvironmentProvider as b, setClientIpLookupEnabled as c, registerFlowPreloader as d, resetStandaloneFlowPolicy as f, getFingerprint as g, isBrowserSimulation as h, initializeSession as i, whenSessionFingerprintSettled as l, setStandaloneFlowPolicy as m, getFingerprintEnabled as n, setClientFingerprintEnabled as o, resolveStandaloneFlowPolicy as p, getSessionFingerprintResult as r, setClientHostingApp as s, getDisableIpify as t, getStandaloneFlowPolicy as u, getThumbmarkId as v, fingerprintSignalsReporter as x, getDeviceFingerprintInfo as y };
|