@incodetech/core 2.1.1 → 2.2.0-rc.1

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.
Files changed (328) hide show
  1. package/dist/{3dAvatarProvider-BwOmTMOy.esm.js → 3dAvatarProvider-g02DTFqT.esm.js} +811 -880
  2. package/dist/Actor-iTq7YY48.d.ts +1 -0
  3. package/dist/BrowserDiagnosticsCryptoProvider-BwGL3Lmi.esm.js +95 -0
  4. package/dist/BrowserLazyImportProvider-BhoA957O.esm.js +114 -0
  5. package/dist/{BrowserStorageProvider-CBHBhKQN.esm.js → BrowserStorageProvider-k-FDkC4W.esm.js} +2 -4
  6. package/dist/{BrowserTimerProvider-CHloo0eQ.esm.js → BrowserTimerProvider-BXhgNxLt.esm.js} +1 -2
  7. package/dist/{BrowserVisibilityObserverProvider-GBS6XSii.esm.js → BrowserVisibilityObserverProvider-BX1BiLDK.esm.js} +1 -2
  8. package/dist/Face2DProvider-UUQt_vRC.esm.js +437 -0
  9. package/dist/{createFaceAvatar-CpdYp9Iy.d.ts → FaceDetectionProvider-Mh6q3EbA.d.ts} +107 -159
  10. package/dist/IBrowserEnvironmentCapability-DEaRRk-R.esm.js +9 -0
  11. package/dist/IFaceAvatarCapability-BrL19G0s.d.ts +23 -0
  12. package/dist/IFeatureManagementCapability-DdEUp6tB.d.ts +1125 -0
  13. package/dist/IIdCaptureCapability-DHTT3FC2.d.ts +237 -0
  14. package/dist/IStorageCapability-ORkQfK3F.d.ts +242 -0
  15. package/dist/{ITimerCapability-DJ73P4RK.esm.js → ITimerCapability-DgdDzp8G.esm.js} +1 -2
  16. package/dist/{Manager-goNPc_h_.d.ts → Manager-CQQ99QOI.d.ts} +1 -0
  17. package/dist/{MotionSensorProvider-BHuHoYvJ.esm.js → MotionSensorProvider-DGiV77J_.esm.js} +2 -37
  18. package/dist/{OpenViduRecordingProvider-CK6A5kiU.esm.js → OpenViduRecordingProvider-Du98qevC.esm.js} +2 -4
  19. package/dist/PrivacyLensProvider-D8PS7AJa.esm.js +405 -0
  20. package/dist/StateMachine-EDpYWy0i.d.ts +6 -0
  21. package/dist/{StreamCanvasCapture-CAqUdVkM.esm.js → StreamCanvasCapture-D2XcXCZ4.esm.js} +2 -4
  22. package/dist/{addressSearch-D7msRieq.esm.js → addressSearch-DQyrvDQj.esm.js} +10 -21
  23. package/dist/ae-signature.d.ts +4 -6
  24. package/dist/ae-signature.esm.js +10 -11
  25. package/dist/antifraud.d.ts +1 -6
  26. package/dist/antifraud.esm.js +3 -8
  27. package/dist/{antifraudManager-5KA84wtF.esm.js → antifraudManager-B8Plzf7a.esm.js} +11 -8
  28. package/dist/{antifraudManager-DCiNI6np.d.ts → antifraudManager-BY36bS12.d.ts} +3 -3
  29. package/dist/{antifraudStateMachine-BQVw46N5.esm.js → antifraudStateMachine-r4VxSBS4.esm.js} +5 -7
  30. package/dist/api-Bx3gKW_y.esm.js +129 -0
  31. package/dist/{apiError-DkOXfFBu.esm.js → apiError-oiEnJIlk.esm.js} +25 -3
  32. package/dist/authentication.d.ts +3 -19
  33. package/dist/authentication.esm.js +3 -35
  34. package/dist/{authenticationManager-BeT6tNZm.d.ts → authenticationManager-BBMGTcwW.d.ts} +3 -4
  35. package/dist/{authenticationManager-BryLnSaF.esm.js → authenticationManager-Dq_tudSW.esm.js} +7 -10
  36. package/dist/{authenticationStateMachine-DbdxfGHx.esm.js → authenticationStateMachine-D4koAtP3.esm.js} +11 -15
  37. package/dist/avatar.d.ts +2 -2
  38. package/dist/avatar.esm.js +2 -3
  39. package/dist/avatar2dWarm-DqucNFX4.esm.js +1330 -0
  40. package/dist/avatarStats-CdUOb3VD.esm.js +136 -0
  41. package/dist/{backCameraStream-ChrMTJv-.esm.js → backCameraStream-CUeYm5eu.esm.js} +20 -8
  42. package/dist/browser-DlFgHpoC-DnyrCR8r.esm.js +1513 -0
  43. package/dist/callback-645_omgz.d.ts +133 -0
  44. package/dist/camera-_2sXMXiF.esm.js +140 -0
  45. package/dist/camera.d.ts +19 -2
  46. package/dist/camera.esm.js +2 -6
  47. package/dist/{canvas-Pi10hG_l.esm.js → canvas-E1zGkel4.esm.js} +1 -2
  48. package/dist/certificate-issuance.d.ts +34 -39
  49. package/dist/certificate-issuance.esm.js +4 -11
  50. package/dist/{certificateIssuanceStateMachine-DlZQT1_u.esm.js → certificateIssuanceStateMachine-COd7_l2T.esm.js} +7 -11
  51. package/dist/consent.d.ts +1 -4
  52. package/dist/consent.esm.js +3 -8
  53. package/dist/{consentManager-BwNu-uC-.esm.js → consentManager-BApTlfA0.esm.js} +5 -7
  54. package/dist/{consentManager-B4PMGXW-.d.ts → consentManager-uhDPdU6i.d.ts} +55 -61
  55. package/dist/{consentStateMachine-BOkVFiU7.esm.js → consentStateMachine-WD-S-Yhs.esm.js} +5 -7
  56. package/dist/{cpf-16m_cGAM.esm.js → cpf-BIADjddF.esm.js} +1 -2
  57. package/dist/createFaceAvatar-BEj18KXi.d.ts +50 -0
  58. package/dist/createFaceAvatar-DQKaRise.esm.js +103 -0
  59. package/dist/cross-document-data-match.d.ts +2 -26
  60. package/dist/cross-document-data-match.esm.js +2 -71
  61. package/dist/crossDocumentDataMatchManager-Dq8Z3SOg.d.ts +41 -0
  62. package/dist/crossDocumentDataMatchManager-OmYvyung.esm.js +84 -0
  63. package/dist/curp-validation.d.ts +1 -11
  64. package/dist/curp-validation.esm.js +3 -8
  65. package/dist/{curpValidationManager-CoqODZx5.d.ts → curpValidationManager-DVGr7Fq7.d.ts} +4 -6
  66. package/dist/{curpValidationManager-Cbji2inV.esm.js → curpValidationManager-UZxcrsrz.esm.js} +11 -7
  67. package/dist/{curpValidationStateMachine-Dlw4qfFb.esm.js → curpValidationStateMachine-9KwnqeoB.esm.js} +22 -14
  68. package/dist/custom-fields.d.ts +2 -5
  69. package/dist/custom-fields.esm.js +24 -11
  70. package/dist/custom-watchlist.d.ts +1 -3
  71. package/dist/custom-watchlist.esm.js +11 -10
  72. package/dist/{customWatchlistStateMachine-D8w0mNxm.esm.js → customWatchlistStateMachine-B_ey3TFj.esm.js} +5 -7
  73. package/dist/{dateUtils-BW6mBV6p.esm.js → dateUtils-CvG0FvK8.esm.js} +1 -2
  74. package/dist/{deepsightService-CViys6T4.esm.js → deepsightLoader-CWE0SvF1.esm.js} +68 -14
  75. package/dist/{deepsightService-BuTOFTr8.d.ts → deepsightService-DLVQS_RH.d.ts} +41 -2
  76. package/dist/device.d.ts +10 -2
  77. package/dist/device.esm.js +21 -21
  78. package/dist/document-capture.d.ts +3 -1816
  79. package/dist/document-capture.esm.js +3 -245
  80. package/dist/document-upload.d.ts +48 -55
  81. package/dist/document-upload.esm.js +8 -14
  82. package/dist/documentCaptureManager-B3t0ydtg.d.ts +2062 -0
  83. package/dist/documentCaptureManager-DszmcU-l.esm.js +296 -0
  84. package/dist/{documentCaptureStateMachine-BkTvU3yq.esm.js → documentCaptureStateMachine-D2jBwwVb.esm.js} +66 -40
  85. package/dist/dynamic-forms.d.ts +2 -4
  86. package/dist/dynamic-forms.esm.js +3 -9
  87. package/dist/{dynamicFormsManager-CHXUBNs4.esm.js → dynamicFormsManager-B-OmpJkU.esm.js} +48 -9
  88. package/dist/{dynamicFormsManager-CKZkE7Wo.d.ts → dynamicFormsManager-fhK0yINk.d.ts} +22 -46
  89. package/dist/{dynamicFormsStateMachine-DJ1HGZff.esm.js → dynamicFormsStateMachine-D_3oLtOE.esm.js} +161 -34
  90. package/dist/ekyb.d.ts +5 -137
  91. package/dist/ekyb.esm.js +4 -179
  92. package/dist/ekybManager-BJVp2ahf.esm.js +178 -0
  93. package/dist/ekybManager-Dzswb_b8.d.ts +114 -0
  94. package/dist/{ekybStateMachine-D9GzA4MW.esm.js → ekybStateMachine-BYcc9VaR.esm.js} +16 -193
  95. package/dist/ekyc.d.ts +2 -79
  96. package/dist/ekyc.esm.js +4 -154
  97. package/dist/ekycManager-BFpHbBoT.d.ts +97 -0
  98. package/dist/ekycManager-oTstTJuL.esm.js +156 -0
  99. package/dist/{ekycStateMachine-DnVRiu3s.esm.js → ekycStateMachine-DHvksnrr.esm.js} +141 -423
  100. package/dist/ekycUtils-Dew1rBG0.esm.js +223 -0
  101. package/dist/electronic-signature.d.ts +3 -5
  102. package/dist/electronic-signature.esm.js +2 -10
  103. package/dist/{electronicSignatureManager-DESRgObX.esm.js → electronicSignatureManager-CApcBEQd.esm.js} +47 -33
  104. package/dist/{index-36QX_21w.d.ts → electronicSignatureManager-CcUXQZS7.d.ts} +220 -251
  105. package/dist/email.d.ts +1 -5
  106. package/dist/email.esm.js +3 -10
  107. package/dist/{emailManager-CMS4q_r6.d.ts → emailManager-CADXW_9X.d.ts} +4 -7
  108. package/dist/{emailManager-B9Vrv3Ma.esm.js → emailManager-tE-YvNtS.esm.js} +76 -12
  109. package/dist/{emailStateMachine-CbmKFVSi.esm.js → emailStateMachine-Bm894MHB.esm.js} +7 -9
  110. package/dist/{endpoints-CwrFQfW7.esm.js → endpoints-CCzL3XD_.esm.js} +55 -6
  111. package/dist/{events-1wxZ97yf.esm.js → events-CxfNJVZW.esm.js} +43 -176
  112. package/dist/events.d.ts +28 -10
  113. package/dist/events.esm.js +2 -4
  114. package/dist/extensibility.d.ts +37 -37
  115. package/dist/extensibility.esm.js +31 -80
  116. package/dist/{externalFetch-hvmz_npP.esm.js → externalFetch-BKBThAUC.esm.js} +2 -4
  117. package/dist/face-match.d.ts +2 -225
  118. package/dist/face-match.esm.js +3 -173
  119. package/dist/{faceCaptureManagerFactory-C9TiGbkA.esm.js → faceCaptureManagerFactory-4VejGOQX.esm.js} +52 -31
  120. package/dist/{faceCaptureManagerFactory-DiJ64oem.d.ts → faceCaptureManagerFactory-BxWPpxyd.d.ts} +63 -24
  121. package/dist/{faceCaptureSetup-BqhqfFHL.esm.js → faceCaptureSetup-BB5KEtbV.esm.js} +57 -36
  122. package/dist/faceMatchManager-BXp2WUT-.esm.js +201 -0
  123. package/dist/faceMatchManager-BnvrZM2F.d.ts +268 -0
  124. package/dist/{faceMatchStateMachine-MDb30gCm.esm.js → faceMatchStateMachine-CJiO2yLO.esm.js} +14 -10
  125. package/dist/feature-management-DS_Nj5Gg.esm.js +615 -0
  126. package/dist/feature-management.d.ts +173 -0
  127. package/dist/feature-management.esm.js +2 -0
  128. package/dist/field-comparison.d.ts +1 -4
  129. package/dist/field-comparison.esm.js +2 -7
  130. package/dist/{fieldComparisonManager-OLKVsG2Z.d.ts → fieldComparisonManager-CBvEGxFx.d.ts} +3 -5
  131. package/dist/{fieldComparisonManager-Cw4uzD7S.esm.js → fieldComparisonManager-DhnYdYZ2.esm.js} +6 -11
  132. package/dist/fiscal-qr.d.ts +1 -6
  133. package/dist/fiscal-qr.esm.js +14 -29
  134. package/dist/flow-events.d.ts +2 -9
  135. package/dist/flow.d.ts +59 -21
  136. package/dist/flow.esm.js +132 -49
  137. package/dist/{flowCompletionService-B6P6_EF3.esm.js → flowCompletionService-Bt3wD28k.esm.js} +4 -6
  138. package/dist/flowServices-b0Pd4F1K.esm.js +620 -0
  139. package/dist/geolocation.d.ts +1 -4
  140. package/dist/geolocation.esm.js +3 -9
  141. package/dist/geolocationManager-Cz744E5S.d.ts +506 -0
  142. package/dist/{geolocationManager-CF6-NizA.esm.js → geolocationManager-DGwnL5lg.esm.js} +44 -16
  143. package/dist/{geolocationStateMachine-CD2XJs1b.esm.js → geolocationStateMachine-il6jz5DZ.esm.js} +53 -28
  144. package/dist/{getBrowser-1yNcfFZR.esm.js → getBrowser-Cb8Zgrgp.esm.js} +1 -2
  145. package/dist/getBrowser-DNrQeL4T.esm.js +16 -0
  146. package/dist/getDeviceClass-9y-kbVDw.esm.js +19 -0
  147. package/dist/{getDeviceClass-C-Dg6IsJ.esm.js → getDeviceClass-CeBiEayS.esm.js} +1 -2
  148. package/dist/getParsedUserAgent-pJjATANs.esm.js +1622 -0
  149. package/dist/government-validation.d.ts +3 -6
  150. package/dist/government-validation.esm.js +7 -13
  151. package/dist/{governmentValidationStateMachine-BE5wiQ7Y.esm.js → governmentValidationStateMachine-BYKYUdza.esm.js} +8 -11
  152. package/dist/home.d.ts +14 -22
  153. package/dist/home.esm.js +3 -8
  154. package/dist/http.d.ts +0 -1
  155. package/dist/http.esm.js +2 -4
  156. package/dist/id-ocr.d.ts +8 -7
  157. package/dist/id-ocr.esm.js +20 -9
  158. package/dist/id-selfie-flow.d.ts +179 -0
  159. package/dist/id-selfie-flow.esm.js +917 -0
  160. package/dist/id-verification.d.ts +2 -191
  161. package/dist/id-verification.esm.js +3 -43
  162. package/dist/id.d.ts +7 -18
  163. package/dist/id.esm.js +47 -53
  164. package/dist/{idCaptureDefaults-CZajItdO.esm.js → idCaptureDefaults-WeHbQM7W.esm.js} +54 -17
  165. package/dist/idCaptureManager-BjU-Wyow.d.ts +429 -0
  166. package/dist/{idCaptureManager-DASPUMtC.esm.js → idCaptureManager-DgohUfUQ.esm.js} +173 -34
  167. package/dist/idCaptureServices-RDiDS9tg.esm.js +396 -0
  168. package/dist/{idCaptureStateMachine-DZ2ZTSxu.esm.js → idCaptureStateMachine-DWocZD_m.esm.js} +438 -585
  169. package/dist/{idOcrManager-Tm4LzKR0.esm.js → idOcrManager-CvJZhmBR.esm.js} +4 -7
  170. package/dist/{idOcrManager-DLfAjDZn.d.ts → idOcrManager-DXc_xRN7.d.ts} +62 -229
  171. package/dist/{idOcrStateMachine-BJxZCxwS.esm.js → idOcrStateMachine-Bq_e3l4E.esm.js} +15 -20
  172. package/dist/idVerificationManager-BB4Pj_N6.d.ts +197 -0
  173. package/dist/idVerificationManager-CduNXhWd.esm.js +51 -0
  174. package/dist/{idVerificationStateMachine-DXN9WcdM.esm.js → idVerificationStateMachine-GEQWUPU2.esm.js} +5 -7
  175. package/dist/identity-reuse.d.ts +1 -4
  176. package/dist/identity-reuse.esm.js +3 -8
  177. package/dist/{identityReuseManager-LjkPvSQN.esm.js → identityReuseManager-D5vXknnJ.esm.js} +24 -7
  178. package/dist/{identityReuseManager-CLVOYxcp.d.ts → identityReuseManager-v2TH5g7e.d.ts} +38 -43
  179. package/dist/{identityReuseStateMachine-Bp-zONoV.esm.js → identityReuseStateMachine-AubRPhIi.esm.js} +6 -8
  180. package/dist/index-B8weJxmL.d.ts +1 -0
  181. package/dist/index-BKOWUhxG.d.ts +258 -0
  182. package/dist/{index-DrpWp15Z.d.ts → index-CLMF0QLQ.d.ts} +3 -3
  183. package/dist/index.d.ts +1 -3
  184. package/dist/index.esm.js +2 -15
  185. package/dist/{invokeOnCaptureCallback-CCS2Ruzi.esm.js → invokeOnCaptureCallback-1m1VJ3Q4.esm.js} +2 -4
  186. package/dist/{lib-Bjd6nOLG.esm.js → lib-DAyUtOTj.esm.js} +1510 -1589
  187. package/dist/mandatory-consent.d.ts +2 -10
  188. package/dist/mandatory-consent.esm.js +3 -8
  189. package/dist/{mandatoryConsentManager-DeBmOHcQ.d.ts → mandatoryConsentManager-B29kR0XA.d.ts} +60 -85
  190. package/dist/{mandatoryConsentManager-DZ26sg4B.esm.js → mandatoryConsentManager-BeELm1zS.esm.js} +4 -7
  191. package/dist/{mandatoryConsentStateMachine-_44ZoDSh.esm.js → mandatoryConsentStateMachine-zroQGzwb.esm.js} +5 -7
  192. package/dist/manualReviewService-D4IkipnN.esm.js +15 -0
  193. package/dist/{mediaRecorderOptions-CClCKAiF.esm.js → mediaRecorderOptions-dALSV8af.esm.js} +2 -4
  194. package/dist/{mediapipeShared-Bcmkzs3x.esm.js → mediapipeShared-B6oNoXEQ.esm.js} +21 -9
  195. package/dist/{onDeviceFaceResults-DILtthks.esm.js → onDeviceFaceResults-C6IRJHQB.esm.js} +30 -87
  196. package/dist/openviduLazy-CCDpFWg1.esm.js +10 -0
  197. package/dist/{otp-B1YeyRXu.d.ts → otp-CEWfTj9v.d.ts} +0 -1
  198. package/dist/{otp-uaXiKt_R.esm.js → otp-D2k3PeSL.esm.js} +3 -14
  199. package/dist/{permissionGuards-BNOe4Tnu.esm.js → permissionGuards-KINpmKtI.esm.js} +2 -4
  200. package/dist/{permissionServices-C_kxhNeo.esm.js → permissionServices-UvUcOSRb.esm.js} +35 -28
  201. package/dist/personhood.d.ts +13 -20
  202. package/dist/personhood.esm.js +153 -85
  203. package/dist/phone.d.ts +1 -5
  204. package/dist/phone.esm.js +3 -10
  205. package/dist/{phoneManager-_KtitbUA.d.ts → phoneManager-BBU8Lq0O.d.ts} +4 -7
  206. package/dist/{phoneManager-CRblfdcI.esm.js → phoneManager-Cpiai2IM.esm.js} +82 -12
  207. package/dist/{phoneStateMachine-DjFGWMjQ.esm.js → phoneStateMachine-E1fUUcNM.esm.js} +7 -9
  208. package/dist/{platform-0Ot-bF_a.esm.js → platform-BJrm5nzZ.esm.js} +31 -11
  209. package/dist/privacyLensWorker-DI-Rg83h.esm.js +355 -0
  210. package/dist/qe-signature.d.ts +4 -6
  211. package/dist/qe-signature.esm.js +10 -11
  212. package/dist/{recordingService-CxaYkITO.esm.js → recordingService-N4RhdyiT.esm.js} +13 -31
  213. package/dist/redirect-to-mobile.d.ts +2 -6
  214. package/dist/redirect-to-mobile.esm.js +3 -10
  215. package/dist/{redirectToMobileManager-dv29o_LS.d.ts → redirectToMobileManager-BD2PvT5B.d.ts} +8 -44
  216. package/dist/{redirectToMobileManager-DbuNUlru.esm.js → redirectToMobileManager-C0dfc7f6.esm.js} +28 -8
  217. package/dist/{redirectToMobileStateMachine-BRaIJWOM.esm.js → redirectToMobileStateMachine-C9SYCJcH.esm.js} +74 -18
  218. package/dist/rolldown-runtime-FZ4Itg2g.esm.js +42 -0
  219. package/dist/{runChildModule-kojSv3MH.esm.js → runChildModule-DpRmKWV0.esm.js} +10 -9
  220. package/dist/{WasmUtilProvider-BgzcXBdl.esm.js → safeStorage-Ep56I-f_.esm.js} +98 -473
  221. package/dist/selfie.d.ts +8 -21
  222. package/dist/selfie.esm.js +40 -47
  223. package/dist/selfieErrorUtils-C2PYBVsp.esm.js +90 -0
  224. package/dist/{selfieManager-B1Px3GGa.esm.js → selfieManager-CmoNiluM.esm.js} +7 -10
  225. package/dist/{selfieManager-4juKfrHG.d.ts → selfieManager-DwlCppg0.d.ts} +3 -4
  226. package/dist/{selfieStateMachine-D0TS93Tu.esm.js → selfieStateMachine-L9pghTly.esm.js} +14 -29
  227. package/dist/{session-CLsU2Jnb.esm.js → session-DeR_I24J.esm.js} +16 -7
  228. package/dist/session.d.ts +12 -10
  229. package/dist/session.esm.js +5 -15
  230. package/dist/sessionInitializer-DNgRpf5Y.esm.js +1865 -0
  231. package/dist/{setup-CfNsYAeB.esm.js → setup-DuYKUt0r.esm.js} +319 -137
  232. package/dist/{setup-CmA2apmN.d.ts → setup-DywQeePQ.d.ts} +186 -4
  233. package/dist/signature.d.ts +2 -96
  234. package/dist/signature.esm.js +3 -108
  235. package/dist/signatureManager-DGBSWz2_.d.ts +106 -0
  236. package/dist/signatureManager-DdPgcmou.esm.js +113 -0
  237. package/dist/{signatureStateMachine-CdhlMih-.esm.js → signatureStateMachine-Cf73DGWO.esm.js} +5 -7
  238. package/dist/spawn-D9jgw9pW.d.ts +1441 -0
  239. package/dist/src-0Jurt29N.esm.js +4482 -0
  240. package/dist/{stats-BVy52wLy.esm.js → stats-B0nFKawG.esm.js} +3 -5
  241. package/dist/stats.esm.js +2 -5
  242. package/dist/topLevelStateName-B5i2avbh.esm.js +41 -0
  243. package/dist/{tri-CFAPtAUM.esm.js → tri-4RsGrIt6.esm.js} +3 -119
  244. package/dist/tri.d.ts +2 -2
  245. package/dist/tri.esm-BIjHhBJ2.esm.js +2620 -0
  246. package/dist/tri.esm.js +2 -4
  247. package/dist/trueSight-BTl_vvd3.esm.js +1 -0
  248. package/dist/trueSightService-s3T95geD.esm.js +1894 -0
  249. package/dist/trust-graph.d.ts +4 -5
  250. package/dist/trust-graph.esm.js +13 -9
  251. package/dist/types-BEwVKkLJ.d.ts +15 -0
  252. package/dist/{types-BKLb3C42.esm.js → types-BN5RPPIZ.esm.js} +1 -2
  253. package/dist/types-BSBzhHRH.d.ts +57 -0
  254. package/dist/types-BX_XkMsQ2.d.ts +21 -0
  255. package/dist/types-BfHiko5D.d.ts +48 -0
  256. package/dist/{types-D8Cl1N2Z.d.ts → types-BfgmV7s72.d.ts} +2 -2
  257. package/dist/types-CJ7Yl9K-2.d.ts +164 -0
  258. package/dist/types-DPIDuhut.d.ts +40 -0
  259. package/dist/types-DVmXIdzW.d.ts +82 -0
  260. package/dist/types-DelMqZLe.d.ts +105 -0
  261. package/dist/types-EELWyWpd.d.ts +6 -0
  262. package/dist/{types-fO6KIdol.d.ts → types-Hmd7U0JA.d.ts} +80 -6
  263. package/dist/{types-BUgeB2X6.d.ts → types-KPvmag_B.d.ts} +7 -7
  264. package/dist/types-M6eb82ra2.d.ts +589 -0
  265. package/dist/{types-DV3wkhQ4.d.ts → types-Vb4P9ovf.d.ts} +1 -3
  266. package/dist/{urlUtils-CpiYwn7w.esm.js → urlUtils-D6phjq1-.esm.js} +1 -2
  267. package/dist/{video-ZY92rkel.esm.js → video-BtSWtHy1.esm.js} +1 -2
  268. package/dist/video-selfie.d.ts +71 -117
  269. package/dist/video-selfie.esm.js +575 -643
  270. package/dist/videoSelfieCameraWarmer-DPx5Lm3d.esm.js +651 -0
  271. package/dist/videoSelfieStepDetector-D3oo2ofo.d.ts +123 -0
  272. package/dist/wasm.d.ts +2 -4
  273. package/dist/wasm.esm.js +4 -15
  274. package/dist/wasmDefaults-DTUrftxR.esm.js +125 -0
  275. package/dist/{wasmDsFlagSync-Ch0mFJNT.esm.js → wasmDsFlagSync-BqUCwLY8.esm.js} +2 -4
  276. package/dist/wasmWebClient-DM8lkb0z.esm.js +407 -0
  277. package/dist/watchlist-for-business.d.ts +1 -3
  278. package/dist/watchlist-for-business.esm.js +9 -9
  279. package/dist/watchlist.d.ts +1 -52
  280. package/dist/watchlist.esm.js +3 -70
  281. package/dist/{watchlistForBusinessStateMachine-R1Yp1g5A.esm.js → watchlistForBusinessStateMachine-BcBMkMvV.esm.js} +5 -7
  282. package/dist/watchlistManager-CjSMmbyq.esm.js +83 -0
  283. package/dist/watchlistManager-DLXef90v.d.ts +68 -0
  284. package/dist/{watchlistStateMachine-D07UVq1m.esm.js → watchlistStateMachine-Bl7Wy9Cm.esm.js} +5 -7
  285. package/dist/workflow.d.ts +239 -203
  286. package/dist/workflow.esm.js +156 -101
  287. package/dist/xstate-actors.esm-CtI5S0f4.esm.js +310 -0
  288. package/dist/{xstate.esm-nY3M5UYm.esm.js → xstate.esm-Cf4e0Cfd.esm.js} +136 -610
  289. package/package.json +14 -9
  290. package/dist/Actor-BwgmOPkb.d.ts +0 -2
  291. package/dist/Face2DProvider-CZU11g6r.esm.js +0 -824
  292. package/dist/FaceDetectionProvider-CPWg-PAH.d.ts +0 -119
  293. package/dist/IWasmUtilCapability-DaSNxgA8.d.ts +0 -150
  294. package/dist/PrivacyLensProvider-B_zrV25p.esm.js +0 -339
  295. package/dist/StateMachine-D5WO6lHS.d.ts +0 -2
  296. package/dist/StreamCanvasCapture-DHaWferF.d.ts +0 -42
  297. package/dist/ae-signature-Pp4oCAHD.esm.js +0 -12
  298. package/dist/api-DsbUi7TO.esm.js +0 -72
  299. package/dist/browser-DlFgHpoC-Br3G10gw.esm.js +0 -1425
  300. package/dist/browserSimulation-DZwEy9bu.esm.js +0 -2804
  301. package/dist/camera-CxxXV0VN.esm.js +0 -79
  302. package/dist/canvas-90BqS0NF.d.ts +0 -112
  303. package/dist/chunk-CIKcdghV.esm.js +0 -49
  304. package/dist/clientLifecycle-VyzRfALg.esm.js +0 -534
  305. package/dist/cpf-ocr.d.ts +0 -10
  306. package/dist/cpf-ocr.esm.js +0 -8
  307. package/dist/cpfOcrManager-9eM4z4o7.esm.js +0 -190
  308. package/dist/cpfOcrManager-C5U9E0hf.d.ts +0 -216
  309. package/dist/createFaceAvatar-BZSg2MNo.esm.js +0 -46
  310. package/dist/deepsightLoader-CU_tiLMx.esm.js +0 -62
  311. package/dist/flowServices-DkQmOkLV.esm.js +0 -208
  312. package/dist/geolocationManager-DaHYFkVO.d.ts +0 -156
  313. package/dist/getDeviceClass-DIjnTPjR.esm.js +0 -14
  314. package/dist/http-CnsKEaJY.esm.js +0 -0
  315. package/dist/idCaptureManager-CwuXtVu6.d.ts +0 -1013
  316. package/dist/index-BAyZ8_iI.d.ts +0 -93
  317. package/dist/openviduLazy-jPgABwrt.esm.js +0 -3
  318. package/dist/openviduLazy-wEojM41w.esm.js +0 -12
  319. package/dist/qe-signature-BnWIpR-O.esm.js +0 -12
  320. package/dist/sessionInitializer-Dj7-aJaP.esm.js +0 -547
  321. package/dist/tri.esm-DDJ1zOqG.esm.js +0 -2593
  322. package/dist/types-BcF-fii5.d.ts +0 -5
  323. package/dist/videoSelfieSteps-Djpv7cjb.esm.js +0 -58
  324. /package/dist/{IVisibilityObserverCapability-BZ1rE7ly.d.ts → IVisibilityObserverCapability-D4tvIB5v.d.ts} +0 -0
  325. /package/dist/{camera-CKU96nwJ.d.ts → camera-9wWD-pwg.d.ts} +0 -0
  326. /package/dist/{flowCompletionService-BOSTlAWo.d.ts → flowCompletionService-BlAHsKyv.d.ts} +0 -0
  327. /package/dist/{types-BgjMAEXl.d.ts → types-Bk_6dmDa.d.ts} +0 -0
  328. /package/dist/{warmup-Dd0iq6KF.d.ts → warmup-Dv2alr2-.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ import "./StateMachine-EDpYWy0i.js";
@@ -0,0 +1,95 @@
1
+ //#region ../infra/src/crypto/truesightKey.ts
2
+ /** Interim P1 key id — the BE looks up the AES key by this label. */
3
+ const TRUESIGHT_KID = "truesight-v1";
4
+ const KEY_LENGTH_BYTES = 32;
5
+ /** Recovers the key from its two obfuscated halves. Throws on malformed input. */
6
+ function decodeTruesightKey(s0Base64, s1Base64) {
7
+ const s0 = fromBase64(s0Base64);
8
+ const s1 = fromBase64(s1Base64);
9
+ if (s0.length !== s1.length || s0.length === 0) throw new Error("truesight key halves are malformed");
10
+ const key = new Uint8Array(s0.length);
11
+ for (let i = 0; i < key.length; i += 1) key[i] = s1[(i + 7) % s1.length] ^ s0[i];
12
+ return key;
13
+ }
14
+ /**
15
+ * The bundle's key, decoded lazily — `null` when this build carries no key
16
+ * (defines absent → collect-only mode, uploads disabled). Returns a fresh
17
+ * copy per call so callers may zero their copy after use.
18
+ */
19
+ function getTruesightKey() {
20
+ try {
21
+ const key = decodeTruesightKey("Z5SNwx3tvo9MEpKXEnanT6Onh7iUZMrZiYA1RUZKbko=", "QHRMF00NdMLP3SR0Z2jjNiffdu+wAATSt208l8XIJhQ=");
22
+ return key.length === KEY_LENGTH_BYTES ? key : null;
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ function fromBase64(value) {
28
+ return Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
29
+ }
30
+ //#endregion
31
+ //#region ../infra/src/providers/browser/BrowserDiagnosticsCryptoProvider.ts
32
+ /**
33
+ * Browser sealer for TrueSight diagnostics (ENG-48677 plan §1.5): JSON string →
34
+ * gzip via native CompressionStream → AES-256-GCM via WebCrypto → contract
35
+ * envelope. Designed to be loaded as a LAZY chunk — zero bytes on the host
36
+ * page's critical path.
37
+ *
38
+ * The CryptoKey is imported once (non-extractable) and the raw bytes are zeroed
39
+ * immediately after import; `getKeyBytes` must therefore return a fresh copy.
40
+ */
41
+ var BrowserDiagnosticsCryptoProvider = class {
42
+ constructor(getKeyBytes = getTruesightKey, kid = TRUESIGHT_KID) {
43
+ this.getKeyBytes = getKeyBytes;
44
+ this.kid = kid;
45
+ this.keyPromise = null;
46
+ }
47
+ isSupported() {
48
+ return typeof crypto !== "undefined" && typeof crypto.subtle !== "undefined" && typeof crypto.getRandomValues === "function" && typeof CompressionStream !== "undefined";
49
+ }
50
+ async seal(plaintext) {
51
+ const [gz, key] = await Promise.all([gzipUtf8(plaintext), this.importKeyOnce()]);
52
+ const iv = crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(12));
53
+ const additionalData = new TextEncoder().encode(`v1|A256GCM|gzip|${this.kid}`);
54
+ const sealed = new Uint8Array(await crypto.subtle.encrypt({
55
+ name: "AES-GCM",
56
+ iv,
57
+ additionalData
58
+ }, key, gz));
59
+ const tagStart = sealed.length - 16;
60
+ return {
61
+ version: 1,
62
+ alg: "A256GCM",
63
+ compression: "gzip",
64
+ kid: this.kid,
65
+ iv: toBase64Url(iv),
66
+ ciphertext: toBase64Url(sealed.subarray(0, tagStart)),
67
+ tag: toBase64Url(sealed.subarray(tagStart))
68
+ };
69
+ }
70
+ importKeyOnce() {
71
+ this.keyPromise ??= (async () => {
72
+ const bytes = this.getKeyBytes();
73
+ if (!bytes || bytes.length !== 32) throw new Error("TrueSight diagnostics key unavailable in this build");
74
+ const copy = new Uint8Array(bytes);
75
+ try {
76
+ return await crypto.subtle.importKey("raw", copy, { name: "AES-GCM" }, false, ["encrypt"]);
77
+ } finally {
78
+ copy.fill(0);
79
+ bytes.fill(0);
80
+ }
81
+ })();
82
+ return this.keyPromise;
83
+ }
84
+ };
85
+ async function gzipUtf8(text) {
86
+ const stream = new Blob([text]).stream().pipeThrough(new CompressionStream("gzip"));
87
+ return new Uint8Array(await new Response(stream).arrayBuffer());
88
+ }
89
+ function toBase64Url(bytes) {
90
+ let binary = "";
91
+ for (let i = 0; i < bytes.length; i += 1) binary += String.fromCharCode(bytes[i]);
92
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/u, "");
93
+ }
94
+ //#endregion
95
+ export { BrowserDiagnosticsCryptoProvider };
@@ -0,0 +1,114 @@
1
+ import { t as BrowserTimerProvider } from "./BrowserTimerProvider-BXhgNxLt.esm.js";
2
+ //#region ../infra/src/providers/browser/BrowserLazyImportProvider.ts
3
+ /**
4
+ * Per-module {@link LazyImport} handle.
5
+ *
6
+ * Encapsulates the caching, deduplication, and optional-timeout logic for a
7
+ * single lazily-imported module:
8
+ * - Caches the resolved module (via a dedicated `loaded` flag, so a module
9
+ * that legitimately resolves `undefined` is still cached) and returns it
10
+ * immediately on subsequent calls.
11
+ * - Deduplicates concurrent `load()` calls behind a single in-flight promise.
12
+ * - Optionally races the dynamic import against a configurable timeout (ms).
13
+ * - On timeout or import error: emits a `console.warn`, clears the in-flight
14
+ * promise so the next `load()` call retries, and resolves `undefined`.
15
+ *
16
+ * An attempt-generation token (`attempt`) guards against a stale import
17
+ * mutating state after it has been superseded: when a load times out (or the
18
+ * handle is `reset()`), the token is bumped so the still-pending import can no
19
+ * longer write to `cachedValue` / `loaded`.
20
+ */
21
+ var LazyImportHandle = class {
22
+ constructor(_loader, _options, _timer) {
23
+ this._loader = _loader;
24
+ this._options = _options;
25
+ this._timer = _timer;
26
+ this._loaded = false;
27
+ this._attempt = 0;
28
+ }
29
+ get() {
30
+ return this._cachedValue;
31
+ }
32
+ load() {
33
+ if (this._loaded) return Promise.resolve(this._cachedValue);
34
+ if (!this._inFlight) this._inFlight = this.startLoad();
35
+ return this._inFlight;
36
+ }
37
+ reset() {
38
+ this._cachedValue = void 0;
39
+ this._loaded = false;
40
+ this._inFlight = void 0;
41
+ this._attempt++;
42
+ }
43
+ startLoad() {
44
+ const attempt = ++this._attempt;
45
+ const { timeoutMs } = this._options;
46
+ let loaderResult;
47
+ try {
48
+ loaderResult = this._loader();
49
+ } catch (err) {
50
+ loaderResult = Promise.reject(err);
51
+ }
52
+ const loadPromise = loaderResult.then((value) => {
53
+ if (attempt === this._attempt) {
54
+ this._cachedValue = value;
55
+ this._loaded = true;
56
+ }
57
+ return value;
58
+ }, (err) => {
59
+ if (attempt === this._attempt) {
60
+ this.warnFailure(err);
61
+ this._inFlight = void 0;
62
+ }
63
+ });
64
+ if (timeoutMs === void 0) return loadPromise;
65
+ let timeoutHandle;
66
+ const timeoutPromise = new Promise((resolve) => {
67
+ timeoutHandle = this._timer.setTimeout(() => {
68
+ if (attempt === this._attempt) {
69
+ this.warnTimeout(timeoutMs);
70
+ this._inFlight = void 0;
71
+ this._attempt++;
72
+ }
73
+ resolve(void 0);
74
+ }, timeoutMs);
75
+ });
76
+ return Promise.race([loadPromise, timeoutPromise]).finally(() => {
77
+ if (timeoutHandle !== void 0) this._timer.clearTimeout(timeoutHandle);
78
+ });
79
+ }
80
+ warnFailure(err) {
81
+ const { label, moduleName } = this._options;
82
+ console.warn(`[${label}] Failed to load ${moduleName}; ${this.fallback()}`, err);
83
+ }
84
+ warnTimeout(timeoutMs) {
85
+ const { label, moduleName } = this._options;
86
+ console.warn(`[${label}] ${moduleName} failed to load within ${timeoutMs / 1e3}s; ${this.fallback()}`);
87
+ }
88
+ fallback() {
89
+ return this._options.disabledMessage ?? "module will be unavailable.";
90
+ }
91
+ };
92
+ /**
93
+ * Concrete implementation of {@link ILazyImportCapability}.
94
+ *
95
+ * `create()` returns a per-module {@link LazyImportHandle}. The
96
+ * {@link ITimerCapability} is injected so tests can replace the real
97
+ * `setTimeout`/`clearTimeout` with a controllable fake.
98
+ */
99
+ var BrowserLazyImportProvider = class BrowserLazyImportProvider {
100
+ constructor(timer) {
101
+ this._timer = timer ?? BrowserTimerProvider.getInstance();
102
+ }
103
+ static getInstance() {
104
+ return this._instance ??= new BrowserLazyImportProvider();
105
+ }
106
+ static resetInstance() {
107
+ this._instance = void 0;
108
+ }
109
+ create(loader, options) {
110
+ return new LazyImportHandle(loader, options, this._timer);
111
+ }
112
+ };
113
+ //#endregion
114
+ export { BrowserLazyImportProvider as t };
@@ -1,5 +1,4 @@
1
- import { n as resolveLocalStorage } from "./MotionSensorProvider-BHuHoYvJ.esm.js";
2
-
1
+ import { t as resolveLocalStorage } from "./safeStorage-Ep56I-f_.esm.js";
3
2
  //#region ../infra/src/providers/browser/BrowserStorageProvider.ts
4
3
  /**
5
4
  * Browser-based storage provider wrapping localStorage.
@@ -64,6 +63,5 @@ var BrowserStorageProvider = class {
64
63
  storage.clear();
65
64
  }
66
65
  };
67
-
68
66
  //#endregion
69
- export { BrowserStorageProvider as t };
67
+ export { BrowserStorageProvider as t };
@@ -17,6 +17,5 @@ var BrowserTimerProvider = class BrowserTimerProvider {
17
17
  clearInterval(handle);
18
18
  }
19
19
  };
20
-
21
20
  //#endregion
22
- export { BrowserTimerProvider as t };
21
+ export { BrowserTimerProvider as t };
@@ -13,6 +13,5 @@ var BrowserVisibilityObserverProvider = class {
13
13
  };
14
14
  }
15
15
  };
16
-
17
16
  //#endregion
18
- export { BrowserVisibilityObserverProvider as t };
17
+ export { BrowserVisibilityObserverProvider as t };
@@ -0,0 +1,437 @@
1
+ import { t as createHiddenVideoElement } from "./video-BtSWtHy1.esm.js";
2
+ import { a as publishAvatarStats, r as isAvatarStatsEnabled, t as createAvatarStatsReporter } from "./avatarStats-CdUOb3VD.esm.js";
3
+ import { n as createFaceLandmarker, t as asRvfc } from "./mediapipeShared-B6oNoXEQ.esm.js";
4
+ import { i as detectWorkerSourceInstrumentation, o as createFramePacer, r as createTrackProcessor } from "./privacyLensWorker-DI-Rg83h.esm.js";
5
+ import { a as createAvatar2DPoseCore, c as SatinSmileyRenderer, i as AVATAR2D_POSE_CORE_DEFAULTS, l as resolveAvatar2DAssets, n as buildAvatar2DTrackWorkerSource, o as createAvatar2DPoseCoreDeps, r as canUseAvatar2DWorker, s as extractCompactFace, t as buildAvatar2DRenderWorkerSource, takeWarmAvatar2DWorker } from "./avatar2dWarm-DqucNFX4.esm.js";
6
+ //#region ../infra/src/avatar/2d-default-avatar/Face2DProvider.ts
7
+ /**
8
+ * 2D satin-face avatar — MediaPipe-tracked, 2D sprite renderer.
9
+ * **Self-contained** (its own MediaPipe loop; see FACE_AVATAR.md → Isolation and ownership).
10
+ * Carries mobile robustness patterns (FACE_AVATAR.md → Mobile hardening): `window.Module` shield,
11
+ * CPU delegate, transformation matrix OFF, landmark-derived pose, NaN guards.
12
+ */
13
+ const DEFAULT_MAX_FPS = 30;
14
+ const DETECT_MAX_EDGE = 320;
15
+ const DETECT_MIN_INTERVAL_MS = 66;
16
+ const DETECT_INTERVAL_TOLERANCE_MS = 8;
17
+ const MAX_DETECT_FAILURES = 30;
18
+ const WORKER_START_TIMEOUT_MS = 5e3;
19
+ /** Grace period for the worker to ack 'stop' before hard termination. */
20
+ const WORKER_STOP_GRACE_MS = 500;
21
+ /** Cadence of the main→worker dev statsEnabled/state-override bridge. */
22
+ const BRIDGE_INTERVAL_MS = 250;
23
+ /** Dev override global (poc demos): workers can't see it, so it is bridged. */
24
+ function readAvatarStateOverride() {
25
+ const v = globalThis.__incodeAvatarState;
26
+ return v === "detecting" || v === "success" || v === "error" ? v : null;
27
+ }
28
+ var Avatar2DProvider = class {
29
+ constructor() {
30
+ this.renderer = new SatinSmileyRenderer(512);
31
+ this.videoHandle = null;
32
+ this.landmarker = null;
33
+ this.inputCanvas = document.createElement("canvas");
34
+ this.inputCtx = null;
35
+ this.rafId = null;
36
+ this.pacer = createFramePacer(DEFAULT_MAX_FPS);
37
+ this.stats = createAvatarStatsReporter("avatar-2d");
38
+ this.stopped = false;
39
+ this.renderWorker = null;
40
+ this.trackWorker = null;
41
+ this.clonedTrack = null;
42
+ this.bridgeId = null;
43
+ this.lastBridgedStatsEnabled = false;
44
+ this.lastBridgedOverride = null;
45
+ this.mediapipeModulePath = "";
46
+ this.mediapipeWasmPath = "";
47
+ this.faceLandmarkerModelPath = "";
48
+ this.detectFailures = 0;
49
+ this.poseCore = createAvatar2DPoseCore(AVATAR2D_POSE_CORE_DEFAULTS, createAvatar2DPoseCoreDeps());
50
+ this.lastDetectAt = 0;
51
+ this.usingRvfc = false;
52
+ this.rvfcHandle = null;
53
+ this.lastSetState = null;
54
+ this.loop = (now) => {
55
+ if (this.stopped) return;
56
+ this.scheduleNextFrame();
57
+ if (!this.pacer.shouldRender(now)) {
58
+ this.stats.frameDropped();
59
+ return;
60
+ }
61
+ const measure = isAvatarStatsEnabled();
62
+ const frameStart = measure ? performance.now() : 0;
63
+ let detectMs;
64
+ const video = this.videoHandle?.element;
65
+ if (video && video.readyState >= 2 && this.landmarker) this.detectOnMainThread(video, now, measure, (ms) => {
66
+ detectMs = ms;
67
+ });
68
+ this.renderer.render(this.poseCore.tick(now));
69
+ if (measure) this.stats.frameRendered(now, detectMs, performance.now() - frameStart);
70
+ };
71
+ }
72
+ getCanvas() {
73
+ return this.renderer.getCanvas();
74
+ }
75
+ setState(state) {
76
+ this.renderer.setState(state);
77
+ this.lastSetState = state;
78
+ try {
79
+ this.renderWorker?.postMessage({
80
+ type: "state",
81
+ state
82
+ });
83
+ } catch {}
84
+ }
85
+ async start(stream, options = {}) {
86
+ const assets = resolveAvatar2DAssets({
87
+ mediapipeModulePath: options.assets?.mediapipeModulePath,
88
+ mediapipeWasmPath: options.assets?.mediapipeWasmPath,
89
+ faceLandmarkerModelPath: options.assets?.faceLandmarkerModelPath
90
+ });
91
+ this.mediapipeModulePath = assets.mediapipeModulePath;
92
+ this.mediapipeWasmPath = assets.mediapipeWasmPath;
93
+ this.faceLandmarkerModelPath = assets.faceLandmarkerModelPath;
94
+ const maxFps = options.maxFps ?? DEFAULT_MAX_FPS;
95
+ this.pacer = createFramePacer(maxFps);
96
+ this.poseCore = createAvatar2DPoseCore({
97
+ ...AVATAR2D_POSE_CORE_DEFAULTS,
98
+ dtSeedMs: 1e3 / maxFps
99
+ }, createAvatar2DPoseCoreDeps());
100
+ if (await this.tryStartWorker(stream, maxFps)) return;
101
+ if (this.stopped) return;
102
+ this.videoHandle = createHiddenVideoElement(stream, { keepStreamAlive: true });
103
+ try {
104
+ this.renderer.init();
105
+ const video = this.videoHandle.element;
106
+ this.usingRvfc = !!asRvfc(video);
107
+ this.scheduleNextFrame();
108
+ this.startMainTracking();
109
+ } catch (error) {
110
+ this.stop();
111
+ throw error;
112
+ }
113
+ }
114
+ /**
115
+ * Background landmarker bring-up for the MAIN-THREAD path. On failure the
116
+ * avatar stays in its neutral searching state (the face remains concealed)
117
+ * rather than tearing down the already-mounted canvas.
118
+ */
119
+ async startMainTracking() {
120
+ try {
121
+ this.landmarker = await this.createLandmarker();
122
+ if (this.stopped) {
123
+ this.landmarker?.close();
124
+ this.landmarker = null;
125
+ return;
126
+ }
127
+ this.stats.dispose();
128
+ this.stats = createAvatarStatsReporter("avatar-2d", "main");
129
+ } catch (error) {
130
+ console.warn("[face-avatar] avatar-2d tracking failed to start — avatar stays in searching state (capture unaffected)", error);
131
+ }
132
+ }
133
+ /** rVFC (one callback per camera frame) when available, else capped rAF. (§1.) */
134
+ scheduleNextFrame() {
135
+ if (this.stopped) return;
136
+ const video = this.videoHandle?.element;
137
+ const rvfc = this.usingRvfc && video ? asRvfc(video) : null;
138
+ if (rvfc) this.rvfcHandle = rvfc.requestVideoFrameCallback(this.loop);
139
+ else this.rafId = requestAnimationFrame(this.loop);
140
+ }
141
+ stop() {
142
+ this.stopped = true;
143
+ this.stats.dispose();
144
+ if (this.bridgeId != null) {
145
+ clearInterval(this.bridgeId);
146
+ this.bridgeId = null;
147
+ }
148
+ if (this.renderWorker || this.trackWorker) {
149
+ try {
150
+ this.renderWorker?.postMessage({ type: "stop" });
151
+ this.trackWorker?.postMessage({ type: "stop" });
152
+ } catch {}
153
+ const pendingRender = this.renderWorker;
154
+ const pendingTrack = this.trackWorker;
155
+ setTimeout(() => {
156
+ if (this.renderWorker === pendingRender || this.trackWorker === pendingTrack) this.finalizeWorkers();
157
+ }, WORKER_STOP_GRACE_MS);
158
+ }
159
+ if (this.rafId != null) {
160
+ cancelAnimationFrame(this.rafId);
161
+ this.rafId = null;
162
+ }
163
+ const stoppingVideo = this.videoHandle?.element;
164
+ if (stoppingVideo && this.rvfcHandle != null) {
165
+ asRvfc(stoppingVideo)?.cancelVideoFrameCallback(this.rvfcHandle);
166
+ this.rvfcHandle = null;
167
+ }
168
+ this.landmarker?.close();
169
+ this.landmarker = null;
170
+ this.renderer.dispose();
171
+ this.videoHandle?.dispose();
172
+ this.videoHandle = null;
173
+ }
174
+ /**
175
+ * Worker transport, TWO workers: clone the track, feed it to a
176
+ * MediaStreamTrackProcessor, adopt (or boot) the TRACK worker, boot the
177
+ * RENDER worker, wire them with a MessageChannel, transfer the renderer's
178
+ * canvas + the readable, and wait for the render worker's ms-fast 'started'
179
+ * handshake (the track worker's MediaPipe bring-up runs in the background —
180
+ * or already ran via the tutorial warm-up). Any failure tears down —
181
+ * recreating the renderer if its canvas was already transferred — and
182
+ * returns false so the main-thread path takes over. Never throws.
183
+ */
184
+ async tryStartWorker(stream, maxFps) {
185
+ if (!canUseAvatar2DWorker()) return false;
186
+ const sourceTrack = stream.getVideoTracks()[0];
187
+ if (!sourceTrack) return false;
188
+ let track = null;
189
+ let processor;
190
+ try {
191
+ track = sourceTrack.clone();
192
+ processor = createTrackProcessor(track);
193
+ } catch {
194
+ track?.stop();
195
+ return false;
196
+ }
197
+ let trackWorker = takeWarmAvatar2DWorker({
198
+ mediapipeModulePath: this.mediapipeModulePath,
199
+ mediapipeWasmPath: this.mediapipeWasmPath,
200
+ faceLandmarkerModelPath: this.faceLandmarkerModelPath
201
+ });
202
+ let trackBlobUrl = null;
203
+ if (!trackWorker) {
204
+ const trackSource = buildAvatar2DTrackWorkerSource();
205
+ const trackInstrumenter = detectWorkerSourceInstrumentation(trackSource);
206
+ if (trackInstrumenter) {
207
+ console.error(`[face-avatar] avatar-2d worker source was instrumented by "${trackInstrumenter}" and cannot run in a worker; using the slower main-thread avatar. Exclude packages/infra from that transform (see docs/features/FACE_AVATAR.md → Worker transport).`);
208
+ track.stop();
209
+ return false;
210
+ }
211
+ try {
212
+ trackBlobUrl = URL.createObjectURL(new Blob([trackSource], { type: "text/javascript" }));
213
+ trackWorker = new Worker(trackBlobUrl);
214
+ } catch {
215
+ if (trackBlobUrl) URL.revokeObjectURL(trackBlobUrl);
216
+ track.stop();
217
+ return false;
218
+ }
219
+ }
220
+ const renderSource = buildAvatar2DRenderWorkerSource();
221
+ const renderInstrumenter = detectWorkerSourceInstrumentation(renderSource);
222
+ let renderWorker = null;
223
+ let renderBlobUrl = null;
224
+ if (!renderInstrumenter) try {
225
+ renderBlobUrl = URL.createObjectURL(new Blob([renderSource], { type: "text/javascript" }));
226
+ renderWorker = new Worker(renderBlobUrl);
227
+ } catch {
228
+ if (renderBlobUrl) URL.revokeObjectURL(renderBlobUrl);
229
+ renderBlobUrl = null;
230
+ renderWorker = null;
231
+ }
232
+ if (!renderWorker) {
233
+ if (renderInstrumenter) console.error(`[face-avatar] avatar-2d worker source was instrumented by "${renderInstrumenter}" and cannot run in a worker; using the slower main-thread avatar. Exclude packages/infra from that transform (see docs/features/FACE_AVATAR.md → Worker transport).`);
234
+ trackWorker.terminate();
235
+ if (trackBlobUrl) URL.revokeObjectURL(trackBlobUrl);
236
+ track.stop();
237
+ return false;
238
+ }
239
+ trackWorker.onmessage = (event) => {
240
+ const message = event.data;
241
+ if (message?.type === "trackingFatal") {
242
+ console.warn("[face-avatar] avatar-2d worker tracking failed to start — avatar stays in searching state (capture unaffected):", message.message);
243
+ trackWorker.terminate();
244
+ if (this.trackWorker === trackWorker) this.trackWorker = null;
245
+ track.stop();
246
+ if (this.clonedTrack === track) this.clonedTrack = null;
247
+ } else if (message?.type === "stopped") {
248
+ trackWorker.terminate();
249
+ if (this.trackWorker === trackWorker) this.trackWorker = null;
250
+ track.stop();
251
+ if (this.clonedTrack === track) this.clonedTrack = null;
252
+ }
253
+ };
254
+ trackWorker.onerror = () => {
255
+ console.warn("[face-avatar] avatar-2d track worker error — pose frozen (capture unaffected)");
256
+ trackWorker.terminate();
257
+ if (this.trackWorker === trackWorker) this.trackWorker = null;
258
+ track.stop();
259
+ if (this.clonedTrack === track) this.clonedTrack = null;
260
+ };
261
+ let started;
262
+ try {
263
+ const channel = new MessageChannel();
264
+ const offscreen = this.renderer.getCanvas().transferControlToOffscreen();
265
+ const handshakeWorker = renderWorker;
266
+ const startedTrackWorker = trackWorker;
267
+ started = await new Promise((resolve) => {
268
+ const timer = setTimeout(() => resolve(false), WORKER_START_TIMEOUT_MS);
269
+ handshakeWorker.onmessage = (event) => {
270
+ if (event.data?.type === "started") {
271
+ clearTimeout(timer);
272
+ resolve(true);
273
+ } else if (event.data?.type === "fatal") {
274
+ clearTimeout(timer);
275
+ resolve(false);
276
+ }
277
+ };
278
+ handshakeWorker.onerror = () => {
279
+ clearTimeout(timer);
280
+ resolve(false);
281
+ };
282
+ handshakeWorker.postMessage({
283
+ type: "start",
284
+ canvas: offscreen,
285
+ port: channel.port1,
286
+ maxFps,
287
+ poseConfig: {
288
+ ...AVATAR2D_POSE_CORE_DEFAULTS,
289
+ dtSeedMs: 1e3 / maxFps
290
+ },
291
+ statsEnabled: isAvatarStatsEnabled()
292
+ }, [offscreen, channel.port1]);
293
+ startedTrackWorker.postMessage({
294
+ type: "start",
295
+ readable: processor.readable,
296
+ port: channel.port2,
297
+ mediapipeModulePath: this.mediapipeModulePath,
298
+ mediapipeWasmPath: this.mediapipeWasmPath,
299
+ faceLandmarkerModelPath: this.faceLandmarkerModelPath,
300
+ detectMaxEdge: DETECT_MAX_EDGE,
301
+ detectMinIntervalMs: DETECT_MIN_INTERVAL_MS,
302
+ detectIntervalToleranceMs: DETECT_INTERVAL_TOLERANCE_MS
303
+ }, [processor.readable, channel.port2]);
304
+ });
305
+ } catch {
306
+ renderWorker.terminate();
307
+ trackWorker.terminate();
308
+ if (renderBlobUrl) URL.revokeObjectURL(renderBlobUrl);
309
+ if (trackBlobUrl) URL.revokeObjectURL(trackBlobUrl);
310
+ track.stop();
311
+ if (!this.stopped) this.renderer = new SatinSmileyRenderer(512);
312
+ return false;
313
+ }
314
+ if (renderBlobUrl) URL.revokeObjectURL(renderBlobUrl);
315
+ if (trackBlobUrl) URL.revokeObjectURL(trackBlobUrl);
316
+ if (!started || this.stopped) {
317
+ renderWorker.terminate();
318
+ trackWorker.terminate();
319
+ track.stop();
320
+ if (!this.stopped) this.renderer = new SatinSmileyRenderer(512);
321
+ return this.stopped;
322
+ }
323
+ this.renderWorker = renderWorker;
324
+ this.trackWorker = trackWorker;
325
+ this.clonedTrack = track;
326
+ this.lastBridgedStatsEnabled = isAvatarStatsEnabled();
327
+ this.lastBridgedOverride = null;
328
+ renderWorker.onmessage = (event) => {
329
+ const message = event.data;
330
+ if (message?.type === "stats") {
331
+ if (!this.stopped) publishAvatarStats(message.snapshot);
332
+ } else if (message?.type === "stopped") {
333
+ this.renderWorker?.terminate();
334
+ this.renderWorker = null;
335
+ }
336
+ };
337
+ renderWorker.onerror = () => {
338
+ console.warn("[face-avatar] avatar-2d render worker error — avatar frozen (capture unaffected)");
339
+ if (this.bridgeId != null) {
340
+ clearInterval(this.bridgeId);
341
+ this.bridgeId = null;
342
+ }
343
+ this.finalizeWorkers();
344
+ };
345
+ if (this.lastSetState) renderWorker.postMessage({
346
+ type: "state",
347
+ state: this.lastSetState
348
+ });
349
+ this.bridgeId = setInterval(() => {
350
+ if (!this.renderWorker) return;
351
+ const enabled = isAvatarStatsEnabled();
352
+ if (enabled !== this.lastBridgedStatsEnabled) {
353
+ this.lastBridgedStatsEnabled = enabled;
354
+ this.renderWorker.postMessage({
355
+ type: "statsEnabled",
356
+ value: enabled
357
+ });
358
+ }
359
+ const override = readAvatarStateOverride();
360
+ if (override !== this.lastBridgedOverride) {
361
+ this.lastBridgedOverride = override;
362
+ this.renderWorker.postMessage({
363
+ type: "override",
364
+ state: override
365
+ });
366
+ }
367
+ }, BRIDGE_INTERVAL_MS);
368
+ return true;
369
+ }
370
+ finalizeWorkers() {
371
+ this.renderWorker?.terminate();
372
+ this.renderWorker = null;
373
+ this.trackWorker?.terminate();
374
+ this.trackWorker = null;
375
+ this.clonedTrack?.stop();
376
+ this.clonedTrack = null;
377
+ }
378
+ /** Loads the FaceLandmarker via the shared shielded init (see mediapipeShared). */
379
+ createLandmarker() {
380
+ return createFaceLandmarker({
381
+ mediapipeModulePath: this.mediapipeModulePath,
382
+ mediapipeWasmPath: this.mediapipeWasmPath,
383
+ faceLandmarkerModelPath: this.faceLandmarkerModelPath
384
+ });
385
+ }
386
+ /** Main-thread detect fallback: downscale → detectForVideo → ingest. */
387
+ detectOnMainThread(video, now, measure, onDetectMs) {
388
+ if (!this.landmarker) return;
389
+ const vw = video.videoWidth;
390
+ const vh = video.videoHeight;
391
+ const detectDue = now - this.lastDetectAt >= DETECT_MIN_INTERVAL_MS - DETECT_INTERVAL_TOLERANCE_MS;
392
+ if (vw > 0 && vh > 0 && detectDue) {
393
+ if (!this.inputCtx) this.inputCtx = this.inputCanvas.getContext("2d");
394
+ if (this.inputCtx) {
395
+ this.lastDetectAt = now;
396
+ const dscale = Math.min(1, DETECT_MAX_EDGE / Math.max(vw, vh));
397
+ const dw = Math.max(1, Math.round(vw * dscale));
398
+ const dh = Math.max(1, Math.round(vh * dscale));
399
+ if (this.inputCanvas.width !== dw || this.inputCanvas.height !== dh) {
400
+ this.inputCanvas.width = dw;
401
+ this.inputCanvas.height = dh;
402
+ }
403
+ this.inputCtx.drawImage(video, 0, 0, dw, dh);
404
+ let result = null;
405
+ const detectStart = measure ? performance.now() : 0;
406
+ try {
407
+ result = this.landmarker.detectForVideo(this.inputCanvas, now);
408
+ this.detectFailures = 0;
409
+ } catch {
410
+ result = null;
411
+ this.detectFailures += 1;
412
+ if (this.detectFailures >= MAX_DETECT_FAILURES) this.recreateLandmarker();
413
+ }
414
+ if (measure) onDetectMs(performance.now() - detectStart);
415
+ this.poseCore.ingest(result ? extractCompactFace(result) : null, dw, dh, now);
416
+ }
417
+ }
418
+ }
419
+ recreateLandmarker() {
420
+ this.detectFailures = 0;
421
+ this.landmarker?.close();
422
+ this.landmarker = null;
423
+ this.createLandmarker().then((lm) => {
424
+ if (this.stopped) {
425
+ lm.close();
426
+ return;
427
+ }
428
+ this.landmarker = lm;
429
+ }).catch(() => {});
430
+ }
431
+ };
432
+ /** Factory used by the avatar actor's provider selection (2D satin-face avatar). */
433
+ function createProvider() {
434
+ return new Avatar2DProvider();
435
+ }
436
+ //#endregion
437
+ export { Avatar2DProvider, createProvider };