@velion-la/onboarding-sdk-react-native 1.0.0-beta.2
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/CHANGELOG.md +66 -0
- package/LICENSE +12 -0
- package/README.md +803 -0
- package/lib/commonjs/camera/AddressSearchBar.js +304 -0
- package/lib/commonjs/camera/AddressSearchBar.js.map +1 -0
- package/lib/commonjs/camera/DocumentCapture.js +505 -0
- package/lib/commonjs/camera/DocumentCapture.js.map +1 -0
- package/lib/commonjs/camera/LivenessCamera.js +534 -0
- package/lib/commonjs/camera/LivenessCamera.js.map +1 -0
- package/lib/commonjs/camera/MapAddressPicker.js +341 -0
- package/lib/commonjs/camera/MapAddressPicker.js.map +1 -0
- package/lib/commonjs/core/VelionOnboarding.js +815 -0
- package/lib/commonjs/core/VelionOnboarding.js.map +1 -0
- package/lib/commonjs/core/sessionDeclinedCopy.js +56 -0
- package/lib/commonjs/core/sessionDeclinedCopy.js.map +1 -0
- package/lib/commonjs/core/sessionStateMapper.js +137 -0
- package/lib/commonjs/core/sessionStateMapper.js.map +1 -0
- package/lib/commonjs/core/sseReasonMessages.js +450 -0
- package/lib/commonjs/core/sseReasonMessages.js.map +1 -0
- package/lib/commonjs/data/iso3166Alpha2Codes.json +1 -0
- package/lib/commonjs/data/iso3166CountryNames.json +251 -0
- package/lib/commonjs/i18n/index.js +30 -0
- package/lib/commonjs/i18n/index.js.map +1 -0
- package/lib/commonjs/i18n/strings/en.js +261 -0
- package/lib/commonjs/i18n/strings/en.js.map +1 -0
- package/lib/commonjs/i18n/strings/es.js +266 -0
- package/lib/commonjs/i18n/strings/es.js.map +1 -0
- package/lib/commonjs/index.js +213 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/steps/AddressInfoStep.js +650 -0
- package/lib/commonjs/steps/AddressInfoStep.js.map +1 -0
- package/lib/commonjs/steps/DocumentsOcrStep.js +397 -0
- package/lib/commonjs/steps/DocumentsOcrStep.js.map +1 -0
- package/lib/commonjs/steps/EmailContactStep.js +145 -0
- package/lib/commonjs/steps/EmailContactStep.js.map +1 -0
- package/lib/commonjs/steps/EmailOtpStep.js +220 -0
- package/lib/commonjs/steps/EmailOtpStep.js.map +1 -0
- package/lib/commonjs/steps/FaceMatchStep.js +166 -0
- package/lib/commonjs/steps/FaceMatchStep.js.map +1 -0
- package/lib/commonjs/steps/FingerprintStep.js +92 -0
- package/lib/commonjs/steps/FingerprintStep.js.map +1 -0
- package/lib/commonjs/steps/HumanBasicInfoStep.js +243 -0
- package/lib/commonjs/steps/HumanBasicInfoStep.js.map +1 -0
- package/lib/commonjs/steps/HumanExtendedInfoStep.js +268 -0
- package/lib/commonjs/steps/HumanExtendedInfoStep.js.map +1 -0
- package/lib/commonjs/steps/LegalBasicInfoStep.js +188 -0
- package/lib/commonjs/steps/LegalBasicInfoStep.js.map +1 -0
- package/lib/commonjs/steps/LegalExtendedInfoStep.js +166 -0
- package/lib/commonjs/steps/LegalExtendedInfoStep.js.map +1 -0
- package/lib/commonjs/steps/LivenessMatchStep.js +707 -0
- package/lib/commonjs/steps/LivenessMatchStep.js.map +1 -0
- package/lib/commonjs/steps/PhoneContactStep.js +146 -0
- package/lib/commonjs/steps/PhoneContactStep.js.map +1 -0
- package/lib/commonjs/steps/PhoneOtpStep.js +219 -0
- package/lib/commonjs/steps/PhoneOtpStep.js.map +1 -0
- package/lib/commonjs/steps/SwornDeclarationStep.js +196 -0
- package/lib/commonjs/steps/SwornDeclarationStep.js.map +1 -0
- package/lib/commonjs/steps/TaxInfoStep.js +244 -0
- package/lib/commonjs/steps/TaxInfoStep.js.map +1 -0
- package/lib/commonjs/steps/TermsAndConditionsStep.js +238 -0
- package/lib/commonjs/steps/TermsAndConditionsStep.js.map +1 -0
- package/lib/commonjs/steps/_shared.js +40 -0
- package/lib/commonjs/steps/_shared.js.map +1 -0
- package/lib/commonjs/steps/types.js +6 -0
- package/lib/commonjs/steps/types.js.map +1 -0
- package/lib/commonjs/transport/api.js +176 -0
- package/lib/commonjs/transport/api.js.map +1 -0
- package/lib/commonjs/transport/irisWebSocket.js +121 -0
- package/lib/commonjs/transport/irisWebSocket.js.map +1 -0
- package/lib/commonjs/transport/secureUrl.js +50 -0
- package/lib/commonjs/transport/secureUrl.js.map +1 -0
- package/lib/commonjs/transport/sse.js +248 -0
- package/lib/commonjs/transport/sse.js.map +1 -0
- package/lib/commonjs/types/index.js +391 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/ui/MapFallbackBoundary.js +42 -0
- package/lib/commonjs/ui/MapFallbackBoundary.js.map +1 -0
- package/lib/commonjs/ui/StepShell.js +118 -0
- package/lib/commonjs/ui/StepShell.js.map +1 -0
- package/lib/commonjs/ui/VelionOnboardingScreen.js +217 -0
- package/lib/commonjs/ui/VelionOnboardingScreen.js.map +1 -0
- package/lib/commonjs/ui/forms/index.js +38 -0
- package/lib/commonjs/ui/forms/index.js.map +1 -0
- package/lib/commonjs/ui/forms/useInlineValidation.js +88 -0
- package/lib/commonjs/ui/forms/useInlineValidation.js.map +1 -0
- package/lib/commonjs/ui/forms/validators.js +34 -0
- package/lib/commonjs/ui/forms/validators.js.map +1 -0
- package/lib/commonjs/ui/icons/HomeHeartIcon.js +38 -0
- package/lib/commonjs/ui/icons/HomeHeartIcon.js.map +1 -0
- package/lib/commonjs/ui/icons/StepIcon.js +59 -0
- package/lib/commonjs/ui/icons/StepIcon.js.map +1 -0
- package/lib/commonjs/ui/overlays/AnalyzingOverlay.js +284 -0
- package/lib/commonjs/ui/overlays/AnalyzingOverlay.js.map +1 -0
- package/lib/commonjs/ui/overlays/LoadingOverlay.js +108 -0
- package/lib/commonjs/ui/overlays/LoadingOverlay.js.map +1 -0
- package/lib/commonjs/ui/overlays/ProgressBar.js +95 -0
- package/lib/commonjs/ui/overlays/ProgressBar.js.map +1 -0
- package/lib/commonjs/ui/overlays/RetryDialog.js +125 -0
- package/lib/commonjs/ui/overlays/RetryDialog.js.map +1 -0
- package/lib/commonjs/ui/overlays/index.js +33 -0
- package/lib/commonjs/ui/overlays/index.js.map +1 -0
- package/lib/commonjs/ui/primitives/Banner.js +81 -0
- package/lib/commonjs/ui/primitives/Banner.js.map +1 -0
- package/lib/commonjs/ui/primitives/Button.js +142 -0
- package/lib/commonjs/ui/primitives/Button.js.map +1 -0
- package/lib/commonjs/ui/primitives/Card.js +50 -0
- package/lib/commonjs/ui/primitives/Card.js.map +1 -0
- package/lib/commonjs/ui/primitives/Checkbox.js +139 -0
- package/lib/commonjs/ui/primitives/Checkbox.js.map +1 -0
- package/lib/commonjs/ui/primitives/CountrySelect.js +288 -0
- package/lib/commonjs/ui/primitives/CountrySelect.js.map +1 -0
- package/lib/commonjs/ui/primitives/DatePicker.js +245 -0
- package/lib/commonjs/ui/primitives/DatePicker.js.map +1 -0
- package/lib/commonjs/ui/primitives/Input.js +101 -0
- package/lib/commonjs/ui/primitives/Input.js.map +1 -0
- package/lib/commonjs/ui/primitives/Select.js +209 -0
- package/lib/commonjs/ui/primitives/Select.js.map +1 -0
- package/lib/commonjs/ui/primitives/Spinner.js +25 -0
- package/lib/commonjs/ui/primitives/Spinner.js.map +1 -0
- package/lib/commonjs/ui/primitives/index.js +69 -0
- package/lib/commonjs/ui/primitives/index.js.map +1 -0
- package/lib/commonjs/ui/theme/ThemeProvider.js +74 -0
- package/lib/commonjs/ui/theme/ThemeProvider.js.map +1 -0
- package/lib/commonjs/ui/theme/index.js +68 -0
- package/lib/commonjs/ui/theme/index.js.map +1 -0
- package/lib/commonjs/ui/theme/tokens.js +154 -0
- package/lib/commonjs/ui/theme/tokens.js.map +1 -0
- package/lib/commonjs/utils/EventEmitter.js +144 -0
- package/lib/commonjs/utils/EventEmitter.js.map +1 -0
- package/lib/commonjs/utils/base64.js +53 -0
- package/lib/commonjs/utils/base64.js.map +1 -0
- package/lib/commonjs/utils/deviceFingerprint.js +132 -0
- package/lib/commonjs/utils/deviceFingerprint.js.map +1 -0
- package/lib/commonjs/utils/documentTypeOptions.js +35 -0
- package/lib/commonjs/utils/documentTypeOptions.js.map +1 -0
- package/lib/commonjs/utils/googleMapsPreflight.js +77 -0
- package/lib/commonjs/utils/googleMapsPreflight.js.map +1 -0
- package/lib/commonjs/utils/hmac.js +58 -0
- package/lib/commonjs/utils/hmac.js.map +1 -0
- package/lib/commonjs/utils/iso3166Countries.js +98 -0
- package/lib/commonjs/utils/iso3166Countries.js.map +1 -0
- package/lib/commonjs/utils/jpegFromUri.js +44 -0
- package/lib/commonjs/utils/jpegFromUri.js.map +1 -0
- package/lib/commonjs/utils/keepAwake.js +58 -0
- package/lib/commonjs/utils/keepAwake.js.map +1 -0
- package/lib/commonjs/utils/log.js +42 -0
- package/lib/commonjs/utils/log.js.map +1 -0
- package/lib/commonjs/utils/osGeocoder.js +70 -0
- package/lib/commonjs/utils/osGeocoder.js.map +1 -0
- package/lib/commonjs/utils/parseGoogleAddressComponents.js +74 -0
- package/lib/commonjs/utils/parseGoogleAddressComponents.js.map +1 -0
- package/lib/commonjs/utils/personNameNormalize.js +24 -0
- package/lib/commonjs/utils/personNameNormalize.js.map +1 -0
- package/lib/commonjs/utils/sdkError.js +34 -0
- package/lib/commonjs/utils/sdkError.js.map +1 -0
- package/lib/commonjs/utils/sdkVersion.js +13 -0
- package/lib/commonjs/utils/sdkVersion.js.map +1 -0
- package/lib/commonjs/utils/stepConfig.js +65 -0
- package/lib/commonjs/utils/stepConfig.js.map +1 -0
- package/lib/commonjs/utils/taxInfoConfig.js +19 -0
- package/lib/commonjs/utils/taxInfoConfig.js.map +1 -0
- package/lib/module/camera/AddressSearchBar.js +299 -0
- package/lib/module/camera/AddressSearchBar.js.map +1 -0
- package/lib/module/camera/DocumentCapture.js +500 -0
- package/lib/module/camera/DocumentCapture.js.map +1 -0
- package/lib/module/camera/LivenessCamera.js +529 -0
- package/lib/module/camera/LivenessCamera.js.map +1 -0
- package/lib/module/camera/MapAddressPicker.js +337 -0
- package/lib/module/camera/MapAddressPicker.js.map +1 -0
- package/lib/module/core/VelionOnboarding.js +811 -0
- package/lib/module/core/VelionOnboarding.js.map +1 -0
- package/lib/module/core/sessionDeclinedCopy.js +52 -0
- package/lib/module/core/sessionDeclinedCopy.js.map +1 -0
- package/lib/module/core/sessionStateMapper.js +128 -0
- package/lib/module/core/sessionStateMapper.js.map +1 -0
- package/lib/module/core/sseReasonMessages.js +446 -0
- package/lib/module/core/sseReasonMessages.js.map +1 -0
- package/lib/module/data/iso3166Alpha2Codes.json +1 -0
- package/lib/module/data/iso3166CountryNames.json +251 -0
- package/lib/module/i18n/index.js +25 -0
- package/lib/module/i18n/index.js.map +1 -0
- package/lib/module/i18n/strings/en.js +257 -0
- package/lib/module/i18n/strings/en.js.map +1 -0
- package/lib/module/i18n/strings/es.js +262 -0
- package/lib/module/i18n/strings/es.js.map +1 -0
- package/lib/module/index.js +36 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/steps/AddressInfoStep.js +646 -0
- package/lib/module/steps/AddressInfoStep.js.map +1 -0
- package/lib/module/steps/DocumentsOcrStep.js +391 -0
- package/lib/module/steps/DocumentsOcrStep.js.map +1 -0
- package/lib/module/steps/EmailContactStep.js +140 -0
- package/lib/module/steps/EmailContactStep.js.map +1 -0
- package/lib/module/steps/EmailOtpStep.js +215 -0
- package/lib/module/steps/EmailOtpStep.js.map +1 -0
- package/lib/module/steps/FaceMatchStep.js +161 -0
- package/lib/module/steps/FaceMatchStep.js.map +1 -0
- package/lib/module/steps/FingerprintStep.js +87 -0
- package/lib/module/steps/FingerprintStep.js.map +1 -0
- package/lib/module/steps/HumanBasicInfoStep.js +238 -0
- package/lib/module/steps/HumanBasicInfoStep.js.map +1 -0
- package/lib/module/steps/HumanExtendedInfoStep.js +263 -0
- package/lib/module/steps/HumanExtendedInfoStep.js.map +1 -0
- package/lib/module/steps/LegalBasicInfoStep.js +183 -0
- package/lib/module/steps/LegalBasicInfoStep.js.map +1 -0
- package/lib/module/steps/LegalExtendedInfoStep.js +161 -0
- package/lib/module/steps/LegalExtendedInfoStep.js.map +1 -0
- package/lib/module/steps/LivenessMatchStep.js +701 -0
- package/lib/module/steps/LivenessMatchStep.js.map +1 -0
- package/lib/module/steps/PhoneContactStep.js +141 -0
- package/lib/module/steps/PhoneContactStep.js.map +1 -0
- package/lib/module/steps/PhoneOtpStep.js +214 -0
- package/lib/module/steps/PhoneOtpStep.js.map +1 -0
- package/lib/module/steps/SwornDeclarationStep.js +191 -0
- package/lib/module/steps/SwornDeclarationStep.js.map +1 -0
- package/lib/module/steps/TaxInfoStep.js +239 -0
- package/lib/module/steps/TaxInfoStep.js.map +1 -0
- package/lib/module/steps/TermsAndConditionsStep.js +233 -0
- package/lib/module/steps/TermsAndConditionsStep.js.map +1 -0
- package/lib/module/steps/_shared.js +33 -0
- package/lib/module/steps/_shared.js.map +1 -0
- package/lib/module/steps/types.js +4 -0
- package/lib/module/steps/types.js.map +1 -0
- package/lib/module/transport/api.js +173 -0
- package/lib/module/transport/api.js.map +1 -0
- package/lib/module/transport/irisWebSocket.js +115 -0
- package/lib/module/transport/irisWebSocket.js.map +1 -0
- package/lib/module/transport/secureUrl.js +45 -0
- package/lib/module/transport/secureUrl.js.map +1 -0
- package/lib/module/transport/sse.js +242 -0
- package/lib/module/transport/sse.js.map +1 -0
- package/lib/module/types/index.js +457 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/ui/MapFallbackBoundary.js +37 -0
- package/lib/module/ui/MapFallbackBoundary.js.map +1 -0
- package/lib/module/ui/StepShell.js +114 -0
- package/lib/module/ui/StepShell.js.map +1 -0
- package/lib/module/ui/VelionOnboardingScreen.js +212 -0
- package/lib/module/ui/VelionOnboardingScreen.js.map +1 -0
- package/lib/module/ui/forms/index.js +5 -0
- package/lib/module/ui/forms/index.js.map +1 -0
- package/lib/module/ui/forms/useInlineValidation.js +84 -0
- package/lib/module/ui/forms/useInlineValidation.js.map +1 -0
- package/lib/module/ui/forms/validators.js +27 -0
- package/lib/module/ui/forms/validators.js.map +1 -0
- package/lib/module/ui/icons/HomeHeartIcon.js +33 -0
- package/lib/module/ui/icons/HomeHeartIcon.js.map +1 -0
- package/lib/module/ui/icons/StepIcon.js +55 -0
- package/lib/module/ui/icons/StepIcon.js.map +1 -0
- package/lib/module/ui/overlays/AnalyzingOverlay.js +279 -0
- package/lib/module/ui/overlays/AnalyzingOverlay.js.map +1 -0
- package/lib/module/ui/overlays/LoadingOverlay.js +104 -0
- package/lib/module/ui/overlays/LoadingOverlay.js.map +1 -0
- package/lib/module/ui/overlays/ProgressBar.js +90 -0
- package/lib/module/ui/overlays/ProgressBar.js.map +1 -0
- package/lib/module/ui/overlays/RetryDialog.js +121 -0
- package/lib/module/ui/overlays/RetryDialog.js.map +1 -0
- package/lib/module/ui/overlays/index.js +6 -0
- package/lib/module/ui/overlays/index.js.map +1 -0
- package/lib/module/ui/primitives/Banner.js +77 -0
- package/lib/module/ui/primitives/Banner.js.map +1 -0
- package/lib/module/ui/primitives/Button.js +138 -0
- package/lib/module/ui/primitives/Button.js.map +1 -0
- package/lib/module/ui/primitives/Card.js +46 -0
- package/lib/module/ui/primitives/Card.js.map +1 -0
- package/lib/module/ui/primitives/Checkbox.js +136 -0
- package/lib/module/ui/primitives/Checkbox.js.map +1 -0
- package/lib/module/ui/primitives/CountrySelect.js +284 -0
- package/lib/module/ui/primitives/CountrySelect.js.map +1 -0
- package/lib/module/ui/primitives/DatePicker.js +241 -0
- package/lib/module/ui/primitives/DatePicker.js.map +1 -0
- package/lib/module/ui/primitives/Input.js +97 -0
- package/lib/module/ui/primitives/Input.js.map +1 -0
- package/lib/module/ui/primitives/Select.js +205 -0
- package/lib/module/ui/primitives/Select.js.map +1 -0
- package/lib/module/ui/primitives/Spinner.js +21 -0
- package/lib/module/ui/primitives/Spinner.js.map +1 -0
- package/lib/module/ui/primitives/index.js +12 -0
- package/lib/module/ui/primitives/index.js.map +1 -0
- package/lib/module/ui/theme/ThemeProvider.js +67 -0
- package/lib/module/ui/theme/ThemeProvider.js.map +1 -0
- package/lib/module/ui/theme/index.js +5 -0
- package/lib/module/ui/theme/index.js.map +1 -0
- package/lib/module/ui/theme/tokens.js +145 -0
- package/lib/module/ui/theme/tokens.js.map +1 -0
- package/lib/module/utils/EventEmitter.js +139 -0
- package/lib/module/utils/EventEmitter.js.map +1 -0
- package/lib/module/utils/base64.js +47 -0
- package/lib/module/utils/base64.js.map +1 -0
- package/lib/module/utils/deviceFingerprint.js +129 -0
- package/lib/module/utils/deviceFingerprint.js.map +1 -0
- package/lib/module/utils/documentTypeOptions.js +31 -0
- package/lib/module/utils/documentTypeOptions.js.map +1 -0
- package/lib/module/utils/googleMapsPreflight.js +73 -0
- package/lib/module/utils/googleMapsPreflight.js.map +1 -0
- package/lib/module/utils/hmac.js +53 -0
- package/lib/module/utils/hmac.js.map +1 -0
- package/lib/module/utils/iso3166Countries.js +92 -0
- package/lib/module/utils/iso3166Countries.js.map +1 -0
- package/lib/module/utils/jpegFromUri.js +40 -0
- package/lib/module/utils/jpegFromUri.js.map +1 -0
- package/lib/module/utils/keepAwake.js +53 -0
- package/lib/module/utils/keepAwake.js.map +1 -0
- package/lib/module/utils/log.js +37 -0
- package/lib/module/utils/log.js.map +1 -0
- package/lib/module/utils/osGeocoder.js +65 -0
- package/lib/module/utils/osGeocoder.js.map +1 -0
- package/lib/module/utils/parseGoogleAddressComponents.js +69 -0
- package/lib/module/utils/parseGoogleAddressComponents.js.map +1 -0
- package/lib/module/utils/personNameNormalize.js +20 -0
- package/lib/module/utils/personNameNormalize.js.map +1 -0
- package/lib/module/utils/sdkError.js +29 -0
- package/lib/module/utils/sdkError.js.map +1 -0
- package/lib/module/utils/sdkVersion.js +9 -0
- package/lib/module/utils/sdkVersion.js.map +1 -0
- package/lib/module/utils/stepConfig.js +59 -0
- package/lib/module/utils/stepConfig.js.map +1 -0
- package/lib/module/utils/taxInfoConfig.js +15 -0
- package/lib/module/utils/taxInfoConfig.js.map +1 -0
- package/lib/typescript/camera/AddressSearchBar.d.ts +37 -0
- package/lib/typescript/camera/AddressSearchBar.d.ts.map +1 -0
- package/lib/typescript/camera/DocumentCapture.d.ts +34 -0
- package/lib/typescript/camera/DocumentCapture.d.ts.map +1 -0
- package/lib/typescript/camera/LivenessCamera.d.ts +50 -0
- package/lib/typescript/camera/LivenessCamera.d.ts.map +1 -0
- package/lib/typescript/camera/MapAddressPicker.d.ts +57 -0
- package/lib/typescript/camera/MapAddressPicker.d.ts.map +1 -0
- package/lib/typescript/core/VelionOnboarding.d.ts +115 -0
- package/lib/typescript/core/VelionOnboarding.d.ts.map +1 -0
- package/lib/typescript/core/sessionDeclinedCopy.d.ts +16 -0
- package/lib/typescript/core/sessionDeclinedCopy.d.ts.map +1 -0
- package/lib/typescript/core/sessionStateMapper.d.ts +33 -0
- package/lib/typescript/core/sessionStateMapper.d.ts.map +1 -0
- package/lib/typescript/core/sseReasonMessages.d.ts +20 -0
- package/lib/typescript/core/sseReasonMessages.d.ts.map +1 -0
- package/lib/typescript/i18n/index.d.ts +13 -0
- package/lib/typescript/i18n/index.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/en.d.ts +3 -0
- package/lib/typescript/i18n/strings/en.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/es.d.ts +260 -0
- package/lib/typescript/i18n/strings/es.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +26 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/steps/AddressInfoStep.d.ts +26 -0
- package/lib/typescript/steps/AddressInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/DocumentsOcrStep.d.ts +26 -0
- package/lib/typescript/steps/DocumentsOcrStep.d.ts.map +1 -0
- package/lib/typescript/steps/EmailContactStep.d.ts +15 -0
- package/lib/typescript/steps/EmailContactStep.d.ts.map +1 -0
- package/lib/typescript/steps/EmailOtpStep.d.ts +21 -0
- package/lib/typescript/steps/EmailOtpStep.d.ts.map +1 -0
- package/lib/typescript/steps/FaceMatchStep.d.ts +27 -0
- package/lib/typescript/steps/FaceMatchStep.d.ts.map +1 -0
- package/lib/typescript/steps/FingerprintStep.d.ts +25 -0
- package/lib/typescript/steps/FingerprintStep.d.ts.map +1 -0
- package/lib/typescript/steps/HumanBasicInfoStep.d.ts +25 -0
- package/lib/typescript/steps/HumanBasicInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/HumanExtendedInfoStep.d.ts +23 -0
- package/lib/typescript/steps/HumanExtendedInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/LegalBasicInfoStep.d.ts +17 -0
- package/lib/typescript/steps/LegalBasicInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/LegalExtendedInfoStep.d.ts +17 -0
- package/lib/typescript/steps/LegalExtendedInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/LivenessMatchStep.d.ts +26 -0
- package/lib/typescript/steps/LivenessMatchStep.d.ts.map +1 -0
- package/lib/typescript/steps/PhoneContactStep.d.ts +15 -0
- package/lib/typescript/steps/PhoneContactStep.d.ts.map +1 -0
- package/lib/typescript/steps/PhoneOtpStep.d.ts +19 -0
- package/lib/typescript/steps/PhoneOtpStep.d.ts.map +1 -0
- package/lib/typescript/steps/SwornDeclarationStep.d.ts +20 -0
- package/lib/typescript/steps/SwornDeclarationStep.d.ts.map +1 -0
- package/lib/typescript/steps/TaxInfoStep.d.ts +19 -0
- package/lib/typescript/steps/TaxInfoStep.d.ts.map +1 -0
- package/lib/typescript/steps/TermsAndConditionsStep.d.ts +21 -0
- package/lib/typescript/steps/TermsAndConditionsStep.d.ts.map +1 -0
- package/lib/typescript/steps/_shared.d.ts +11 -0
- package/lib/typescript/steps/_shared.d.ts.map +1 -0
- package/lib/typescript/steps/types.d.ts +68 -0
- package/lib/typescript/steps/types.d.ts.map +1 -0
- package/lib/typescript/transport/api.d.ts +35 -0
- package/lib/typescript/transport/api.d.ts.map +1 -0
- package/lib/typescript/transport/irisWebSocket.d.ts +72 -0
- package/lib/typescript/transport/irisWebSocket.d.ts.map +1 -0
- package/lib/typescript/transport/secureUrl.d.ts +14 -0
- package/lib/typescript/transport/secureUrl.d.ts.map +1 -0
- package/lib/typescript/transport/sse.d.ts +54 -0
- package/lib/typescript/transport/sse.d.ts.map +1 -0
- package/lib/typescript/types/index.d.ts +1010 -0
- package/lib/typescript/types/index.d.ts.map +1 -0
- package/lib/typescript/ui/MapFallbackBoundary.d.ts +28 -0
- package/lib/typescript/ui/MapFallbackBoundary.d.ts.map +1 -0
- package/lib/typescript/ui/StepShell.d.ts +19 -0
- package/lib/typescript/ui/StepShell.d.ts.map +1 -0
- package/lib/typescript/ui/VelionOnboardingScreen.d.ts +19 -0
- package/lib/typescript/ui/VelionOnboardingScreen.d.ts.map +1 -0
- package/lib/typescript/ui/forms/index.d.ts +3 -0
- package/lib/typescript/ui/forms/index.d.ts.map +1 -0
- package/lib/typescript/ui/forms/useInlineValidation.d.ts +30 -0
- package/lib/typescript/ui/forms/useInlineValidation.d.ts.map +1 -0
- package/lib/typescript/ui/forms/validators.d.ts +11 -0
- package/lib/typescript/ui/forms/validators.d.ts.map +1 -0
- package/lib/typescript/ui/icons/HomeHeartIcon.d.ts +14 -0
- package/lib/typescript/ui/icons/HomeHeartIcon.d.ts.map +1 -0
- package/lib/typescript/ui/icons/StepIcon.d.ts +26 -0
- package/lib/typescript/ui/icons/StepIcon.d.ts.map +1 -0
- package/lib/typescript/ui/overlays/AnalyzingOverlay.d.ts +24 -0
- package/lib/typescript/ui/overlays/AnalyzingOverlay.d.ts.map +1 -0
- package/lib/typescript/ui/overlays/LoadingOverlay.d.ts +19 -0
- package/lib/typescript/ui/overlays/LoadingOverlay.d.ts.map +1 -0
- package/lib/typescript/ui/overlays/ProgressBar.d.ts +26 -0
- package/lib/typescript/ui/overlays/ProgressBar.d.ts.map +1 -0
- package/lib/typescript/ui/overlays/RetryDialog.d.ts +17 -0
- package/lib/typescript/ui/overlays/RetryDialog.d.ts.map +1 -0
- package/lib/typescript/ui/overlays/index.d.ts +4 -0
- package/lib/typescript/ui/overlays/index.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Banner.d.ts +11 -0
- package/lib/typescript/ui/primitives/Banner.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Button.d.ts +27 -0
- package/lib/typescript/ui/primitives/Button.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Card.d.ts +10 -0
- package/lib/typescript/ui/primitives/Card.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Checkbox.d.ts +25 -0
- package/lib/typescript/ui/primitives/Checkbox.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/CountrySelect.d.ts +31 -0
- package/lib/typescript/ui/primitives/CountrySelect.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/DatePicker.d.ts +42 -0
- package/lib/typescript/ui/primitives/DatePicker.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Input.d.ts +17 -0
- package/lib/typescript/ui/primitives/Input.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Select.d.ts +26 -0
- package/lib/typescript/ui/primitives/Select.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/Spinner.d.ts +10 -0
- package/lib/typescript/ui/primitives/Spinner.d.ts.map +1 -0
- package/lib/typescript/ui/primitives/index.d.ts +10 -0
- package/lib/typescript/ui/primitives/index.d.ts.map +1 -0
- package/lib/typescript/ui/theme/ThemeProvider.d.ts +23 -0
- package/lib/typescript/ui/theme/ThemeProvider.d.ts.map +1 -0
- package/lib/typescript/ui/theme/index.d.ts +3 -0
- package/lib/typescript/ui/theme/index.d.ts.map +1 -0
- package/lib/typescript/ui/theme/tokens.d.ts +42 -0
- package/lib/typescript/ui/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/utils/EventEmitter.d.ts +98 -0
- package/lib/typescript/utils/EventEmitter.d.ts.map +1 -0
- package/lib/typescript/utils/base64.d.ts +19 -0
- package/lib/typescript/utils/base64.d.ts.map +1 -0
- package/lib/typescript/utils/deviceFingerprint.d.ts +42 -0
- package/lib/typescript/utils/deviceFingerprint.d.ts.map +1 -0
- package/lib/typescript/utils/documentTypeOptions.d.ts +13 -0
- package/lib/typescript/utils/documentTypeOptions.d.ts.map +1 -0
- package/lib/typescript/utils/googleMapsPreflight.d.ts +44 -0
- package/lib/typescript/utils/googleMapsPreflight.d.ts.map +1 -0
- package/lib/typescript/utils/hmac.d.ts +39 -0
- package/lib/typescript/utils/hmac.d.ts.map +1 -0
- package/lib/typescript/utils/iso3166Countries.d.ts +27 -0
- package/lib/typescript/utils/iso3166Countries.d.ts.map +1 -0
- package/lib/typescript/utils/jpegFromUri.d.ts +29 -0
- package/lib/typescript/utils/jpegFromUri.d.ts.map +1 -0
- package/lib/typescript/utils/keepAwake.d.ts +16 -0
- package/lib/typescript/utils/keepAwake.d.ts.map +1 -0
- package/lib/typescript/utils/log.d.ts +18 -0
- package/lib/typescript/utils/log.d.ts.map +1 -0
- package/lib/typescript/utils/osGeocoder.d.ts +38 -0
- package/lib/typescript/utils/osGeocoder.d.ts.map +1 -0
- package/lib/typescript/utils/parseGoogleAddressComponents.d.ts +43 -0
- package/lib/typescript/utils/parseGoogleAddressComponents.d.ts.map +1 -0
- package/lib/typescript/utils/personNameNormalize.d.ts +10 -0
- package/lib/typescript/utils/personNameNormalize.d.ts.map +1 -0
- package/lib/typescript/utils/sdkError.d.ts +14 -0
- package/lib/typescript/utils/sdkError.d.ts.map +1 -0
- package/lib/typescript/utils/sdkVersion.d.ts +7 -0
- package/lib/typescript/utils/sdkVersion.d.ts.map +1 -0
- package/lib/typescript/utils/stepConfig.d.ts +8 -0
- package/lib/typescript/utils/stepConfig.d.ts.map +1 -0
- package/lib/typescript/utils/taxInfoConfig.d.ts +7 -0
- package/lib/typescript/utils/taxInfoConfig.d.ts.map +1 -0
- package/package.json +99 -0
- package/src/camera/AddressSearchBar.tsx +363 -0
- package/src/camera/DocumentCapture.tsx +505 -0
- package/src/camera/LivenessCamera.tsx +602 -0
- package/src/camera/MapAddressPicker.tsx +397 -0
- package/src/core/VelionOnboarding.ts +974 -0
- package/src/core/sessionDeclinedCopy.ts +76 -0
- package/src/core/sessionStateMapper.ts +167 -0
- package/src/core/sseReasonMessages.ts +531 -0
- package/src/data/iso3166Alpha2Codes.json +1 -0
- package/src/data/iso3166CountryNames.json +251 -0
- package/src/i18n/index.ts +26 -0
- package/src/i18n/strings/en.ts +289 -0
- package/src/i18n/strings/es.ts +291 -0
- package/src/index.ts +137 -0
- package/src/steps/AddressInfoStep.tsx +726 -0
- package/src/steps/DocumentsOcrStep.tsx +472 -0
- package/src/steps/EmailContactStep.tsx +159 -0
- package/src/steps/EmailOtpStep.tsx +250 -0
- package/src/steps/FaceMatchStep.tsx +177 -0
- package/src/steps/FingerprintStep.tsx +99 -0
- package/src/steps/HumanBasicInfoStep.tsx +274 -0
- package/src/steps/HumanExtendedInfoStep.tsx +353 -0
- package/src/steps/LegalBasicInfoStep.tsx +205 -0
- package/src/steps/LegalExtendedInfoStep.tsx +171 -0
- package/src/steps/LivenessMatchStep.tsx +846 -0
- package/src/steps/PhoneContactStep.tsx +160 -0
- package/src/steps/PhoneOtpStep.tsx +249 -0
- package/src/steps/SwornDeclarationStep.tsx +220 -0
- package/src/steps/TaxInfoStep.tsx +277 -0
- package/src/steps/TermsAndConditionsStep.tsx +261 -0
- package/src/steps/_shared.ts +44 -0
- package/src/steps/types.ts +72 -0
- package/src/transport/api.ts +257 -0
- package/src/transport/irisWebSocket.ts +186 -0
- package/src/transport/secureUrl.ts +47 -0
- package/src/transport/sse.ts +310 -0
- package/src/types/index.ts +1198 -0
- package/src/ui/MapFallbackBoundary.tsx +46 -0
- package/src/ui/StepShell.tsx +137 -0
- package/src/ui/VelionOnboardingScreen.tsx +223 -0
- package/src/ui/forms/index.ts +12 -0
- package/src/ui/forms/useInlineValidation.ts +115 -0
- package/src/ui/forms/validators.ts +29 -0
- package/src/ui/icons/HomeHeartIcon.tsx +34 -0
- package/src/ui/icons/StepIcon.tsx +77 -0
- package/src/ui/overlays/AnalyzingOverlay.tsx +323 -0
- package/src/ui/overlays/LoadingOverlay.tsx +115 -0
- package/src/ui/overlays/ProgressBar.tsx +99 -0
- package/src/ui/overlays/RetryDialog.tsx +128 -0
- package/src/ui/overlays/index.ts +3 -0
- package/src/ui/primitives/Banner.tsx +81 -0
- package/src/ui/primitives/Button.tsx +164 -0
- package/src/ui/primitives/Card.tsx +55 -0
- package/src/ui/primitives/Checkbox.tsx +153 -0
- package/src/ui/primitives/CountrySelect.tsx +356 -0
- package/src/ui/primitives/DatePicker.tsx +266 -0
- package/src/ui/primitives/Input.tsx +110 -0
- package/src/ui/primitives/Select.tsx +259 -0
- package/src/ui/primitives/Spinner.tsx +17 -0
- package/src/ui/primitives/index.ts +9 -0
- package/src/ui/theme/ThemeProvider.tsx +102 -0
- package/src/ui/theme/index.ts +17 -0
- package/src/ui/theme/tokens.ts +159 -0
- package/src/utils/EventEmitter.ts +155 -0
- package/src/utils/base64.ts +44 -0
- package/src/utils/deviceFingerprint.ts +184 -0
- package/src/utils/documentTypeOptions.ts +31 -0
- package/src/utils/googleMapsPreflight.ts +72 -0
- package/src/utils/hmac.ts +61 -0
- package/src/utils/iso3166Countries.ts +111 -0
- package/src/utils/jpegFromUri.ts +42 -0
- package/src/utils/keepAwake.ts +62 -0
- package/src/utils/log.ts +37 -0
- package/src/utils/osGeocoder.ts +75 -0
- package/src/utils/parseGoogleAddressComponents.ts +123 -0
- package/src/utils/personNameNormalize.ts +17 -0
- package/src/utils/sdkError.ts +40 -0
- package/src/utils/sdkVersion.ts +6 -0
- package/src/utils/stepConfig.ts +75 -0
- package/src/utils/taxInfoConfig.ts +14 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Secure, centralized API caller for the Velion Onboarding SDK.
|
|
5
|
+
*
|
|
6
|
+
* The SDK version comes from `utils/sdkVersion.ts` (a regular module constant)
|
|
7
|
+
* instead of bundler-injected globals so this code runs identically in Metro.
|
|
8
|
+
*
|
|
9
|
+
* Design decisions:
|
|
10
|
+
* - **Factory pattern** (`createApiCaller`): Returns a pre-configured caller
|
|
11
|
+
* bound to a specific `baseUrl` and `sessionToken`. Modules receive this
|
|
12
|
+
* caller and never have direct access to the token string.
|
|
13
|
+
* - **No API keys**: Only the short-lived `sessionToken` (Bearer) is used.
|
|
14
|
+
* - **AbortController integration**: All calls accept an optional signal,
|
|
15
|
+
* enabling clean cancellation when `VelionOnboarding.destroy()` is called.
|
|
16
|
+
* - **Structured errors**: All failures are normalized into `SdkError` objects
|
|
17
|
+
* with machine-readable codes, never raw exceptions.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { SdkErrorCode } from '../types';
|
|
21
|
+
import { isSecureHttpUrl } from './secureUrl';
|
|
22
|
+
import { log } from '../utils/log';
|
|
23
|
+
import { SDK_VERSION } from '../utils/sdkVersion';
|
|
24
|
+
|
|
25
|
+
/** Hours of clock skew tolerated before we warn the user about an inaccurate device clock. */
|
|
26
|
+
const CLOCK_SKEW_WARN_HOURS = 24;
|
|
27
|
+
const SESSION_EXPIRED_CODE = SdkErrorCode.SESSION_EXPIRED;
|
|
28
|
+
function buildApiError(message, httpStatus, cause) {
|
|
29
|
+
let code;
|
|
30
|
+
if (httpStatus === 401) {
|
|
31
|
+
code = SdkErrorCode.SESSION_EXPIRED;
|
|
32
|
+
} else if (httpStatus === 403) {
|
|
33
|
+
code = SdkErrorCode.SESSION_INVALID;
|
|
34
|
+
} else if (httpStatus === undefined || httpStatus === 0) {
|
|
35
|
+
code = SdkErrorCode.NETWORK_ERROR;
|
|
36
|
+
} else {
|
|
37
|
+
code = SdkErrorCode.API_ERROR;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
code,
|
|
41
|
+
message,
|
|
42
|
+
cause,
|
|
43
|
+
...(httpStatus !== undefined && {
|
|
44
|
+
httpStatus
|
|
45
|
+
})
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates a pre-authorized API caller bound to a specific session.
|
|
50
|
+
* All requests include Authorization: Bearer <sessionToken>.
|
|
51
|
+
*/
|
|
52
|
+
export function createApiCaller(rawBaseUrl, sessionToken, expiresAt) {
|
|
53
|
+
if (!isSecureHttpUrl(rawBaseUrl)) {
|
|
54
|
+
throw {
|
|
55
|
+
code: SdkErrorCode.UNKNOWN,
|
|
56
|
+
message: `Insecure apiUrl: "${rawBaseUrl}". The SDK refuses to send the session token over a non-TLS channel. ` + 'Use https://; http:// is accepted only for loopback (localhost / 127.0.0.1 / ::1).'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Strip a trailing slash so concatenation with endpoints (which always
|
|
60
|
+
// start with `/`) never produces a double slash. This is the same
|
|
61
|
+
// normalization `sse.ts` already does.
|
|
62
|
+
const baseUrl = rawBaseUrl.replace(/\/$/, '');
|
|
63
|
+
let currentToken = sessionToken;
|
|
64
|
+
let currentExpiresAt = expiresAt;
|
|
65
|
+
let clockSkewWarned = false;
|
|
66
|
+
function ensureTokenValid() {
|
|
67
|
+
if (!currentExpiresAt) return;
|
|
68
|
+
const expiry = new Date(currentExpiresAt).getTime();
|
|
69
|
+
if (Number.isNaN(expiry)) return;
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const skewMs = now - expiry;
|
|
72
|
+
if (!clockSkewWarned && Math.abs(skewMs) > CLOCK_SKEW_WARN_HOURS * 60 * 60 * 1000) {
|
|
73
|
+
clockSkewWarned = true;
|
|
74
|
+
log.warn('[api] device clock appears to be off by more than', CLOCK_SKEW_WARN_HOURS, 'h relative to the session expiresAt; falling back to server-side 401 detection.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (now >= expiry) {
|
|
78
|
+
throw {
|
|
79
|
+
code: SESSION_EXPIRED_CODE,
|
|
80
|
+
message: 'Session token has expired. Obtain a new session from your backend.'
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function buildAuthHeaders(extra) {
|
|
85
|
+
return {
|
|
86
|
+
...extra,
|
|
87
|
+
Authorization: `Bearer ${currentToken}`,
|
|
88
|
+
'X-Velion-SDK-Version': SDK_VERSION
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function setSessionToken(token, expiresAtIso) {
|
|
92
|
+
currentToken = token;
|
|
93
|
+
currentExpiresAt = expiresAtIso;
|
|
94
|
+
clockSkewWarned = false;
|
|
95
|
+
}
|
|
96
|
+
async function call(endpoint, init, options = {}) {
|
|
97
|
+
ensureTokenValid();
|
|
98
|
+
const url = `${baseUrl}${endpoint}`;
|
|
99
|
+
let response;
|
|
100
|
+
try {
|
|
101
|
+
const initWithSignal = options.signal !== undefined ? {
|
|
102
|
+
...init,
|
|
103
|
+
signal: options.signal
|
|
104
|
+
} : init;
|
|
105
|
+
response = await fetch(url, initWithSignal);
|
|
106
|
+
} catch (networkErr) {
|
|
107
|
+
const name = networkErr?.name;
|
|
108
|
+
if (name === 'AbortError') {
|
|
109
|
+
throw networkErr;
|
|
110
|
+
}
|
|
111
|
+
throw buildApiError(`Network request failed for "${endpoint}". Check connectivity.`, undefined, networkErr);
|
|
112
|
+
}
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
let errorBody = {};
|
|
115
|
+
try {
|
|
116
|
+
errorBody = await response.json();
|
|
117
|
+
} catch {
|
|
118
|
+
// Body may not be JSON (e.g., a 502 from a proxy). That's fine.
|
|
119
|
+
}
|
|
120
|
+
throw buildApiError(errorBody.message ?? `Backend returned ${response.status} on ${endpoint}.`, response.status, errorBody);
|
|
121
|
+
}
|
|
122
|
+
if (response.status === 204 || response.headers.get('content-length') === '0') {
|
|
123
|
+
return {};
|
|
124
|
+
}
|
|
125
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
126
|
+
if (!contentType.includes('application/json')) {
|
|
127
|
+
return {};
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
return await response.json();
|
|
131
|
+
} catch (parseErr) {
|
|
132
|
+
throw buildApiError(`Failed to parse JSON response from "${endpoint}".`, response.status, parseErr);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function get(endpoint, options) {
|
|
136
|
+
return call(endpoint, {
|
|
137
|
+
method: 'GET',
|
|
138
|
+
headers: buildAuthHeaders(options?.extraHeaders)
|
|
139
|
+
}, options);
|
|
140
|
+
}
|
|
141
|
+
async function post(endpoint, body, options) {
|
|
142
|
+
return call(endpoint, {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
headers: buildAuthHeaders({
|
|
145
|
+
'Content-Type': 'application/json',
|
|
146
|
+
...options?.extraHeaders
|
|
147
|
+
}),
|
|
148
|
+
body: JSON.stringify(body)
|
|
149
|
+
}, options);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Authenticated POST with a `FormData` body. RN's `fetch` mirrors the
|
|
154
|
+
* standard contract: don't set `Content-Type` so the runtime injects the
|
|
155
|
+
* multipart boundary.
|
|
156
|
+
*/
|
|
157
|
+
async function postFormData(endpoint, formData, options) {
|
|
158
|
+
return call(endpoint, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: buildAuthHeaders(options?.extraHeaders),
|
|
161
|
+
body: formData
|
|
162
|
+
}, options);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
get,
|
|
166
|
+
post,
|
|
167
|
+
postFormData,
|
|
168
|
+
setSessionToken
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** The type of the object returned by `createApiCaller`. */
|
|
173
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SdkErrorCode","isSecureHttpUrl","log","SDK_VERSION","CLOCK_SKEW_WARN_HOURS","SESSION_EXPIRED_CODE","SESSION_EXPIRED","buildApiError","message","httpStatus","cause","code","SESSION_INVALID","undefined","NETWORK_ERROR","API_ERROR","createApiCaller","rawBaseUrl","sessionToken","expiresAt","UNKNOWN","baseUrl","replace","currentToken","currentExpiresAt","clockSkewWarned","ensureTokenValid","expiry","Date","getTime","Number","isNaN","now","skewMs","Math","abs","warn","buildAuthHeaders","extra","Authorization","setSessionToken","token","expiresAtIso","call","endpoint","init","options","url","response","initWithSignal","signal","fetch","networkErr","name","ok","errorBody","json","status","headers","get","contentType","includes","parseErr","method","extraHeaders","post","body","JSON","stringify","postFormData","formData"],"sourceRoot":"../../../src","sources":["transport/api.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Typed wrapper around the WebSocket connection to the Iris
|
|
5
|
+
* orchestrator.
|
|
6
|
+
*
|
|
7
|
+
* - Server messages are JSON (`{ type, ... }`). See `IrisServerMessage`.
|
|
8
|
+
* - Client → server frames are either:
|
|
9
|
+
* a) raw `ArrayBuffer` JPEGs (when no HMAC key was returned), or
|
|
10
|
+
* b) JSON envelopes signed with HMAC-SHA256 (see `utils/hmac`).
|
|
11
|
+
*
|
|
12
|
+
* The WebSocket global on RN supports both string and binary payloads, so we
|
|
13
|
+
* don't need any extra polyfills. We do require the URL to be `wss://`
|
|
14
|
+
* (or `ws://localhost:*` for dev) — TLS is enforced.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { isSecureWebSocketUrl } from './secureUrl';
|
|
18
|
+
import { log } from '../utils/log';
|
|
19
|
+
const WS_OPEN = 1;
|
|
20
|
+
|
|
21
|
+
/** Builds the final connect URL with `?token=...&lang=...` query params. */
|
|
22
|
+
export function buildIrisUrl(websocketUrl, connectionToken, locale) {
|
|
23
|
+
let url = websocketUrl;
|
|
24
|
+
if (connectionToken) {
|
|
25
|
+
const sep = url.includes('?') ? '&' : '?';
|
|
26
|
+
url = `${url}${sep}token=${encodeURIComponent(connectionToken)}`;
|
|
27
|
+
}
|
|
28
|
+
const normalizedLang = locale.toLowerCase().startsWith('es') ? 'es' : 'en';
|
|
29
|
+
const langSep = url.includes('?') ? '&' : '?';
|
|
30
|
+
url = `${url}${langSep}lang=${normalizedLang}`;
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Open a WebSocket against the Iris orchestrator. The URL must already include
|
|
36
|
+
* the customer's `connection_token` if Iris enforced auth.
|
|
37
|
+
*
|
|
38
|
+
* `onClose` fires for both clean (`code === 1000`) and unclean closures —
|
|
39
|
+
* callers decide how to react (terminal warning vs. unexpected drop).
|
|
40
|
+
*/
|
|
41
|
+
export function openIrisWebSocket(opts) {
|
|
42
|
+
if (!isSecureWebSocketUrl(opts.websocketUrl)) {
|
|
43
|
+
throw new Error(`Iris websocket_url must be wss:// (or ws://localhost in dev). Got: "${opts.websocketUrl}"`);
|
|
44
|
+
}
|
|
45
|
+
const url = buildIrisUrl(opts.websocketUrl, opts.connectionToken, opts.locale);
|
|
46
|
+
log.info('[IrisWS] opening', {
|
|
47
|
+
url: opts.websocketUrl
|
|
48
|
+
});
|
|
49
|
+
const ws = new WebSocket(url);
|
|
50
|
+
let closed = false;
|
|
51
|
+
ws.onopen = () => {
|
|
52
|
+
log.info('[IrisWS] open');
|
|
53
|
+
opts.onOpen?.();
|
|
54
|
+
};
|
|
55
|
+
ws.onmessage = event => {
|
|
56
|
+
if (typeof event.data !== 'string') return;
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(event.data);
|
|
59
|
+
opts.onMessage(parsed);
|
|
60
|
+
} catch {
|
|
61
|
+
// Iris only sends JSON; ignore noise.
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
ws.onerror = event => {
|
|
65
|
+
log.warn('[IrisWS] error', event);
|
|
66
|
+
opts.onError?.(event);
|
|
67
|
+
};
|
|
68
|
+
ws.onclose = event => {
|
|
69
|
+
log.info('[IrisWS] close', {
|
|
70
|
+
code: event.code,
|
|
71
|
+
reason: event.reason
|
|
72
|
+
});
|
|
73
|
+
closed = true;
|
|
74
|
+
opts.onClose?.(event.code, event.reason ?? '');
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
sendBinary: data => {
|
|
78
|
+
if (closed || ws.readyState !== WS_OPEN) return false;
|
|
79
|
+
try {
|
|
80
|
+
ws.send(data);
|
|
81
|
+
return true;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
log.warn('[IrisWS] sendBinary failed', err);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
sendJson: envelope => {
|
|
88
|
+
if (closed || ws.readyState !== WS_OPEN) return false;
|
|
89
|
+
try {
|
|
90
|
+
ws.send(envelope);
|
|
91
|
+
return true;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
log.warn('[IrisWS] sendJson failed', err);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
close: (code = 1000, reason = '') => {
|
|
98
|
+
if (closed) return;
|
|
99
|
+
closed = true;
|
|
100
|
+
try {
|
|
101
|
+
ws.close(code, reason);
|
|
102
|
+
} catch {
|
|
103
|
+
/* ignore */
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
isOpen: () => !closed && ws.readyState === WS_OPEN
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Subset of WARNING `code`s that mean "Iris is about to close, escalate to
|
|
112
|
+
* the in-flow retry dialog instead of the generic close handler".
|
|
113
|
+
*/
|
|
114
|
+
export const TERMINAL_WARNING_CODES = new Set(['SPOOF_RISK_HIGH', 'SESSION_TERMINATED', 'BIOMETRIC_LOCK']);
|
|
115
|
+
//# sourceMappingURL=irisWebSocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isSecureWebSocketUrl","log","WS_OPEN","buildIrisUrl","websocketUrl","connectionToken","locale","url","sep","includes","encodeURIComponent","normalizedLang","toLowerCase","startsWith","langSep","openIrisWebSocket","opts","Error","info","ws","WebSocket","closed","onopen","onOpen","onmessage","event","data","parsed","JSON","parse","onMessage","onerror","warn","onError","onclose","code","reason","onClose","sendBinary","readyState","send","err","sendJson","envelope","close","isOpen","TERMINAL_WARNING_CODES","Set"],"sourceRoot":"../../../src","sources":["transport/irisWebSocket.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Transport-security guards for runtime URLs.
|
|
5
|
+
*
|
|
6
|
+
* The SDK exchanges bearer tokens, KYC documents and selfies. A misconfigured
|
|
7
|
+
* `apiUrl`, a tampered `liveness-init` response, or a backend that returns a
|
|
8
|
+
* `ws://` URL would all leak that data in cleartext. These helpers force every
|
|
9
|
+
* runtime endpoint to use TLS, with a single carve-out for loopback hosts so
|
|
10
|
+
* developers can still run the SDK against a local backend.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
function isLocalhostHost(host) {
|
|
14
|
+
// `URL.hostname` returns `[::1]` (with brackets) for IPv6 loopback in some
|
|
15
|
+
// engines and `::1` in others — accept both. Strict loopback only: arbitrary
|
|
16
|
+
// `*.local` (Bonjour) or `*.svc.cluster.local` hostnames are NOT exempted —
|
|
17
|
+
// the SDK refuses to send the session token over plain HTTP outside of
|
|
18
|
+
// loopback even if the host is reachable on the local network.
|
|
19
|
+
return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** True when the URL is `https://`, or `http://localhost`-style for dev. */
|
|
23
|
+
export function isSecureHttpUrl(url) {
|
|
24
|
+
try {
|
|
25
|
+
const u = new URL(url);
|
|
26
|
+
if (u.protocol === 'https:') return true;
|
|
27
|
+
if (u.protocol === 'http:') return isLocalhostHost(u.hostname);
|
|
28
|
+
return false;
|
|
29
|
+
} catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** True when the URL is `wss://`, or `ws://localhost`-style for dev. */
|
|
35
|
+
export function isSecureWebSocketUrl(url) {
|
|
36
|
+
try {
|
|
37
|
+
const u = new URL(url);
|
|
38
|
+
if (u.protocol === 'wss:') return true;
|
|
39
|
+
if (u.protocol === 'ws:') return isLocalhostHost(u.hostname);
|
|
40
|
+
return false;
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=secureUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isLocalhostHost","host","isSecureHttpUrl","url","u","URL","protocol","hostname","isSecureWebSocketUrl"],"sourceRoot":"../../../src","sources":["transport/secureUrl.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAeA,CAACC,IAAY,EAAW;EAC9C;EACA;EACA;EACA;EACA;EACA,OACEA,IAAI,KAAK,WAAW,IACpBA,IAAI,KAAK,WAAW,IACpBA,IAAI,KAAK,KAAK,IACdA,IAAI,KAAK,OAAO;AAEpB;;AAEA;AACA,OAAO,SAASC,eAAeA,CAACC,GAAW,EAAW;EACpD,IAAI;IACF,MAAMC,CAAC,GAAG,IAAIC,GAAG,CAACF,GAAG,CAAC;IACtB,IAAIC,CAAC,CAACE,QAAQ,KAAK,QAAQ,EAAE,OAAO,IAAI;IACxC,IAAIF,CAAC,CAACE,QAAQ,KAAK,OAAO,EAAE,OAAON,eAAe,CAACI,CAAC,CAACG,QAAQ,CAAC;IAC9D,OAAO,KAAK;EACd,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF;;AAEA;AACA,OAAO,SAASC,oBAAoBA,CAACL,GAAW,EAAW;EACzD,IAAI;IACF,MAAMC,CAAC,GAAG,IAAIC,GAAG,CAACF,GAAG,CAAC;IACtB,IAAIC,CAAC,CAACE,QAAQ,KAAK,MAAM,EAAE,OAAO,IAAI;IACtC,IAAIF,CAAC,CAACE,QAAQ,KAAK,KAAK,EAAE,OAAON,eAAe,CAACI,CAAC,CAACG,QAAQ,CAAC;IAC5D,OAAO,KAAK;EACd,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview SSE client for React Native, with auto-reconnect.
|
|
5
|
+
*
|
|
6
|
+
* React Native's `fetch` does not expose `body.getReader()`, so we lean on
|
|
7
|
+
* `react-native-sse` — which follows the `EventSource` model and dispatches
|
|
8
|
+
* by `event:` name. If the backend publishes named events
|
|
9
|
+
* (e.g. `event: NextStepRequestedEvent`), the default `'message'` listener
|
|
10
|
+
* never fires.
|
|
11
|
+
*
|
|
12
|
+
* To cover both cases we register the same handler on `'message'` AND on
|
|
13
|
+
* every named event the orchestrator may emit. New event types are
|
|
14
|
+
* discovered automatically the first time the wrapper sees them
|
|
15
|
+
* (`addEventListener` is added on demand) — see the dynamic registration
|
|
16
|
+
* below.
|
|
17
|
+
*
|
|
18
|
+
* ## Reconnection
|
|
19
|
+
*
|
|
20
|
+
* Production deployments behind GCP / k8s ingress (and most load balancers)
|
|
21
|
+
* close idle TCP streams at ~30 s. When that happens `react-native-sse`
|
|
22
|
+
* fires `error` with `{ type: 'error', message: 'cannot parse response',
|
|
23
|
+
* xhrStatus: 200, xhrState: 4 }` — a clean upstream close, not a real
|
|
24
|
+
* transport failure. The native EventSource spec would auto-reconnect
|
|
25
|
+
* here, but `react-native-sse` does not in this scenario, so we wrap it.
|
|
26
|
+
*
|
|
27
|
+
* Strategy:
|
|
28
|
+
* - On `error` or `close`, schedule a reconnect with exponential backoff
|
|
29
|
+
* (capped at 30 s). On `open` of the new connection, reset the attempt
|
|
30
|
+
* counter so a brief blip doesn't punish us forever.
|
|
31
|
+
* - Track `lastEventId` across reconnects — the backend supports
|
|
32
|
+
* `Last-Event-ID` replay via Redis, so we never lose an event that
|
|
33
|
+
* fired during the gap.
|
|
34
|
+
* - Don't escalate transient drops to `onError`: the orchestrator uses
|
|
35
|
+
* that callback to switch to GET polling, which is a much worse UX
|
|
36
|
+
* than a 1 s blip + replay. We still log the underlying error for
|
|
37
|
+
* debugging.
|
|
38
|
+
*
|
|
39
|
+
* Path: `${baseUrl}/sessions/:sessionId/events` (baseUrl already includes `/public/sdk`).
|
|
40
|
+
* Backend: `OnboardingSseController GET /public/sdk/sessions/{sessionId}/events`.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import EventSource from 'react-native-sse';
|
|
44
|
+
import { log } from '../utils/log';
|
|
45
|
+
export const SSE_EVENTS_PATH = '/sessions';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Named events the backend is known to dispatch. The list intentionally
|
|
49
|
+
* covers both the legacy domain-event names (e.g. `NextStepRequestedEvent`)
|
|
50
|
+
* and the public wire types (`ROUTING_COMMAND`, `STEP_UPDATED`, …) so we
|
|
51
|
+
* stay compatible with whichever shape the orchestrator chooses.
|
|
52
|
+
*/
|
|
53
|
+
const KNOWN_EVENT_TYPES = [
|
|
54
|
+
// Public/wire types (preferred — what the SDK code branches on).
|
|
55
|
+
'ROUTING_COMMAND', 'STEP_UPDATED', 'SESSION_APPROVED', 'SESSION_MANUAL_REVIEW', 'SESSION_DECLINED', 'SESSION_TERMINATED',
|
|
56
|
+
// Legacy/domain-event names emitted by `SseDomainEventConsumer` in the
|
|
57
|
+
// Spring orchestrator. Listening to both lets the same SDK build talk to
|
|
58
|
+
// older and newer backends without a config flag.
|
|
59
|
+
'NextStepRequestedEvent', 'StepUpdatedEvent', 'SessionApprovedEvent', 'SessionManualReviewEvent', 'SessionDeclinedEvent', 'SessionTerminatedEvent', 'OnboardingCreatedEvent'];
|
|
60
|
+
|
|
61
|
+
/** Backoff schedule (ms). Last entry repeats indefinitely. */
|
|
62
|
+
const RECONNECT_BACKOFF_MS = [1_000, 2_000, 4_000, 8_000, 15_000, 30_000];
|
|
63
|
+
export function createSessionEventSource(options) {
|
|
64
|
+
const {
|
|
65
|
+
baseUrl,
|
|
66
|
+
sessionId,
|
|
67
|
+
sessionToken,
|
|
68
|
+
lastEventId: initialLastEventId = '0',
|
|
69
|
+
signal,
|
|
70
|
+
onEvent,
|
|
71
|
+
onError
|
|
72
|
+
} = options;
|
|
73
|
+
const base = baseUrl.replace(/\/$/, '');
|
|
74
|
+
const url = `${base}${SSE_EVENTS_PATH}/${sessionId}/events`;
|
|
75
|
+
|
|
76
|
+
/** Updated on every event we receive — replayed via Last-Event-ID. */
|
|
77
|
+
let lastEventId = initialLastEventId;
|
|
78
|
+
let attempt = 0;
|
|
79
|
+
let closed = false;
|
|
80
|
+
let current = null;
|
|
81
|
+
let reconnectTimer = null;
|
|
82
|
+
/**
|
|
83
|
+
* Monotonic id of the active EventSource. Listeners capture their own id
|
|
84
|
+
* and only act if it still matches — events from a previous instance that
|
|
85
|
+
* fire after we've moved on (e.g. `close` fired *because* we called
|
|
86
|
+
* `es.close()` ourselves) are ignored. Without this guard the listeners
|
|
87
|
+
* cascade into runaway reconnect loops.
|
|
88
|
+
*/
|
|
89
|
+
let generation = 0;
|
|
90
|
+
|
|
91
|
+
// Cast to a relaxed type — `react-native-sse` typings are over-strict on
|
|
92
|
+
// the constructor signature when passing a custom-events tuple.
|
|
93
|
+
const EventSourceCtor = EventSource;
|
|
94
|
+
const buildHeaders = () => {
|
|
95
|
+
const headers = {
|
|
96
|
+
Accept: 'text/event-stream',
|
|
97
|
+
Authorization: `Bearer ${sessionToken}`,
|
|
98
|
+
// Hint to any intermediate proxy not to buffer the stream.
|
|
99
|
+
'Cache-Control': 'no-cache'
|
|
100
|
+
};
|
|
101
|
+
if (lastEventId !== '0') {
|
|
102
|
+
headers['Last-Event-ID'] = lastEventId;
|
|
103
|
+
}
|
|
104
|
+
return headers;
|
|
105
|
+
};
|
|
106
|
+
const scheduleReconnect = reason => {
|
|
107
|
+
if (closed) return;
|
|
108
|
+
if (reconnectTimer != null) return; // already scheduled
|
|
109
|
+
const delay = RECONNECT_BACKOFF_MS[Math.min(attempt, RECONNECT_BACKOFF_MS.length - 1)] ?? 30_000;
|
|
110
|
+
attempt += 1;
|
|
111
|
+
log.info('[SSE] Reconnecting', {
|
|
112
|
+
reason,
|
|
113
|
+
attempt,
|
|
114
|
+
delayMs: delay,
|
|
115
|
+
lastEventId
|
|
116
|
+
});
|
|
117
|
+
reconnectTimer = setTimeout(() => {
|
|
118
|
+
reconnectTimer = null;
|
|
119
|
+
if (closed) return;
|
|
120
|
+
tearDown(current);
|
|
121
|
+
current = connect();
|
|
122
|
+
}, delay);
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Detach listeners and close an EventSource that we're about to replace.
|
|
127
|
+
* The listener detach is what stops the cascade: without it, `es.close()`
|
|
128
|
+
* itself dispatches a `close` event, which our handler would catch and
|
|
129
|
+
* schedule another reconnect — even though we already started a new one.
|
|
130
|
+
*/
|
|
131
|
+
const tearDown = es => {
|
|
132
|
+
if (!es) return;
|
|
133
|
+
try {
|
|
134
|
+
es.removeAllEventListeners?.();
|
|
135
|
+
} catch (detachErr) {
|
|
136
|
+
log.warn('[SSE] Error detaching listeners from previous stream', detachErr);
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
es.close();
|
|
140
|
+
} catch (closeErr) {
|
|
141
|
+
log.warn('[SSE] Error closing previous stream', closeErr);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const connect = () => {
|
|
145
|
+
const myGen = ++generation;
|
|
146
|
+
const isStale = () => closed || myGen !== generation;
|
|
147
|
+
const headers = buildHeaders();
|
|
148
|
+
log.info('[SSE] Opening stream', {
|
|
149
|
+
url,
|
|
150
|
+
sessionId,
|
|
151
|
+
hasLastEventId: lastEventId !== '0',
|
|
152
|
+
lastEventId,
|
|
153
|
+
attempt,
|
|
154
|
+
generation: myGen
|
|
155
|
+
});
|
|
156
|
+
const es = new EventSourceCtor(url, {
|
|
157
|
+
headers,
|
|
158
|
+
method: 'GET',
|
|
159
|
+
pollingInterval: 0,
|
|
160
|
+
customEvents: KNOWN_EVENT_TYPES
|
|
161
|
+
});
|
|
162
|
+
es.addEventListener('open', () => {
|
|
163
|
+
if (isStale()) return;
|
|
164
|
+
log.info('[SSE] Stream connected', {
|
|
165
|
+
generation: myGen
|
|
166
|
+
});
|
|
167
|
+
// Reset backoff once the upstream has accepted us — a healthy
|
|
168
|
+
// connection wipes any prior penalty.
|
|
169
|
+
attempt = 0;
|
|
170
|
+
});
|
|
171
|
+
const handleMessage = evt => {
|
|
172
|
+
if (isStale()) return;
|
|
173
|
+
const data = evt.data;
|
|
174
|
+
// Track lastEventId even when we receive a heartbeat / non-JSON
|
|
175
|
+
// chunk: the server still advanced its replay cursor.
|
|
176
|
+
if (typeof evt.lastEventId === 'string' && evt.lastEventId.length > 0) {
|
|
177
|
+
lastEventId = evt.lastEventId;
|
|
178
|
+
}
|
|
179
|
+
if (typeof data !== 'string' || data.length === 0) return;
|
|
180
|
+
try {
|
|
181
|
+
const payload = JSON.parse(data);
|
|
182
|
+
log.info('[SSE] Event received', {
|
|
183
|
+
wireType: evt.type,
|
|
184
|
+
eventType: payload.event_type,
|
|
185
|
+
action: payload.action,
|
|
186
|
+
stepCode: payload.step_code,
|
|
187
|
+
eventId: payload.event_id
|
|
188
|
+
});
|
|
189
|
+
onEvent?.(payload);
|
|
190
|
+
} catch (parseErr) {
|
|
191
|
+
log.warn('[SSE] Failed to parse event payload', {
|
|
192
|
+
wireType: evt.type,
|
|
193
|
+
rawData: data,
|
|
194
|
+
error: parseErr
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
es.addEventListener('message', handleMessage);
|
|
199
|
+
for (const type of KNOWN_EVENT_TYPES) {
|
|
200
|
+
es.addEventListener(type, handleMessage);
|
|
201
|
+
}
|
|
202
|
+
es.addEventListener('error', evt => {
|
|
203
|
+
if (isStale()) return;
|
|
204
|
+
// Most errors here are upstream idle-timeouts from the ingress.
|
|
205
|
+
// Log at info level (not error) to avoid noisy reports, and don't
|
|
206
|
+
// escalate to onError — we'll just reconnect.
|
|
207
|
+
log.info('[SSE] Stream interrupted, will reconnect', evt);
|
|
208
|
+
scheduleReconnect('error');
|
|
209
|
+
});
|
|
210
|
+
es.addEventListener('close', () => {
|
|
211
|
+
if (isStale()) return;
|
|
212
|
+
log.info('[SSE] Stream closed by server, will reconnect');
|
|
213
|
+
scheduleReconnect('close');
|
|
214
|
+
});
|
|
215
|
+
return es;
|
|
216
|
+
};
|
|
217
|
+
current = connect();
|
|
218
|
+
const closeAll = () => {
|
|
219
|
+
if (closed) return;
|
|
220
|
+
closed = true;
|
|
221
|
+
if (reconnectTimer != null) {
|
|
222
|
+
clearTimeout(reconnectTimer);
|
|
223
|
+
reconnectTimer = null;
|
|
224
|
+
}
|
|
225
|
+
tearDown(current);
|
|
226
|
+
current = null;
|
|
227
|
+
};
|
|
228
|
+
if (signal) {
|
|
229
|
+
if (signal.aborted) {
|
|
230
|
+
closeAll();
|
|
231
|
+
} else {
|
|
232
|
+
signal.addEventListener('abort', closeAll);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// We still expose onError so the orchestrator can react to *unrecoverable*
|
|
237
|
+
// failures — but with auto-reconnect, the only realistic trigger is the
|
|
238
|
+
// outer signal aborting. Keep the parameter wired up for future use.
|
|
239
|
+
void onError;
|
|
240
|
+
return closeAll;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EventSource","log","SSE_EVENTS_PATH","KNOWN_EVENT_TYPES","RECONNECT_BACKOFF_MS","createSessionEventSource","options","baseUrl","sessionId","sessionToken","lastEventId","initialLastEventId","signal","onEvent","onError","base","replace","url","attempt","closed","current","reconnectTimer","generation","EventSourceCtor","buildHeaders","headers","Accept","Authorization","scheduleReconnect","reason","delay","Math","min","length","info","delayMs","setTimeout","tearDown","connect","es","removeAllEventListeners","detachErr","warn","close","closeErr","myGen","isStale","hasLastEventId","method","pollingInterval","customEvents","addEventListener","handleMessage","evt","data","payload","JSON","parse","wireType","type","eventType","event_type","action","stepCode","step_code","eventId","event_id","parseErr","rawData","error","closeAll","clearTimeout","aborted"],"sourceRoot":"../../../src","sources":["transport/sse.ts"],"mappings":"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","ignoreList":[]}
|