@onairos/react-native 3.7.2 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/lib/commonjs/api/index.js +219 -9
  2. package/lib/commonjs/components/BodyText.js +27 -9
  3. package/lib/commonjs/components/BrandMark.js +111 -10
  4. package/lib/commonjs/components/CodeInput.js +116 -9
  5. package/lib/commonjs/components/EmailInput.js +30 -8
  6. package/lib/commonjs/components/GoogleButton.js +56 -9
  7. package/lib/commonjs/components/HeadingGroup.js +43 -9
  8. package/lib/commonjs/components/LLMDataInputModal.js +664 -14
  9. package/lib/commonjs/components/ModalHeader.js +99 -9
  10. package/lib/commonjs/components/ModalSheet.js +47 -9
  11. package/lib/commonjs/components/Onairos.js +380 -14
  12. package/lib/commonjs/components/OnairosButton.js +313 -13
  13. package/lib/commonjs/components/OnairosSignInButton.js +130 -12
  14. package/lib/commonjs/components/Overlay.js +465 -13
  15. package/lib/commonjs/components/PersonaImage.js +137 -10
  16. package/lib/commonjs/components/PersonaLoadingScreen.js +318 -12
  17. package/lib/commonjs/components/PersonalizationConsentScreen.js +467 -13
  18. package/lib/commonjs/components/PinCreationScreen.js +403 -12
  19. package/lib/commonjs/components/PinInput.js +464 -9
  20. package/lib/commonjs/components/PlatformConnectorsStep.js +1311 -23
  21. package/lib/commonjs/components/PlatformList.js +137 -10
  22. package/lib/commonjs/components/PlatformToggle.js +180 -9
  23. package/lib/commonjs/components/PrimaryButton.js +180 -10
  24. package/lib/commonjs/components/SignInMatchAnimation.js +197 -9
  25. package/lib/commonjs/components/SignInStep.js +345 -12
  26. package/lib/commonjs/components/UniversalOnboarding.js +2780 -30
  27. package/lib/commonjs/components/VerificationStep.js +176 -11
  28. package/lib/commonjs/components/WelcomeScreen.js +461 -22
  29. package/lib/commonjs/components/icons/Basicproficon.js +37 -8
  30. package/lib/commonjs/components/icons/Basicprofile.js +21 -8
  31. package/lib/commonjs/components/icons/Checkbox.js +21 -8
  32. package/lib/commonjs/components/icons/Checkmark.js +27 -8
  33. package/lib/commonjs/components/icons/Contentanalysis.js +21 -8
  34. package/lib/commonjs/components/icons/Contenticon.js +39 -8
  35. package/lib/commonjs/components/icons/EnochE.js +41 -8
  36. package/lib/commonjs/components/icons/Personalityicon.js +30 -8
  37. package/lib/commonjs/components/icons/Personalityprofile.js +21 -8
  38. package/lib/commonjs/components/icons/Personalitytraits.js +21 -8
  39. package/lib/commonjs/components/icons/Userpreferences.js +21 -8
  40. package/lib/commonjs/components/icons/index.js +84 -17
  41. package/lib/commonjs/components/onboarding/OAuthWebView.js +1754 -18
  42. package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -10
  43. package/lib/commonjs/components/onboarding/PinInput.js +283 -10
  44. package/lib/commonjs/components/onboarding/PlatformConnector.js +249 -11
  45. package/lib/commonjs/config/PLATFORM_APIS.md +849 -0
  46. package/lib/commonjs/config/api.js +56 -7
  47. package/lib/commonjs/constants/index.js +120 -7
  48. package/lib/commonjs/context/AuthContext.js +345 -10
  49. package/lib/commonjs/hooks/useConnectedAccounts.js +111 -9
  50. package/lib/commonjs/hooks/useConnections.js +102 -8
  51. package/lib/commonjs/hooks/useCredentials.js +178 -10
  52. package/lib/commonjs/hooks/useUserConnections.js +148 -10
  53. package/lib/commonjs/index.js +439 -34
  54. package/lib/commonjs/services/apiClient.js +298 -8
  55. package/lib/commonjs/services/biometricPinService.js +180 -8
  56. package/lib/commonjs/services/chatGPTConversationExtractor.js +155 -8
  57. package/lib/commonjs/services/chatGPTConversationService.js +275 -9
  58. package/lib/commonjs/services/claudeConversationExtractor.js +103 -8
  59. package/lib/commonjs/services/claudeConversationService.js +158 -9
  60. package/lib/commonjs/services/connectedAccountsService.js +310 -10
  61. package/lib/commonjs/services/googleAuthService.js +252 -11
  62. package/lib/commonjs/services/hingeDataExtractor.js +105 -8
  63. package/lib/commonjs/services/hingeDataService.js +150 -9
  64. package/lib/commonjs/services/imageCompressionService.js +260 -7
  65. package/lib/commonjs/services/instagramDataExtractor.js +126 -8
  66. package/lib/commonjs/services/instagramDataService.js +163 -9
  67. package/lib/commonjs/services/jwtStorageService.js +276 -7
  68. package/lib/commonjs/services/linkedinDOMExtractor.js +245 -7
  69. package/lib/commonjs/services/linkedinProfileService.js +222 -9
  70. package/lib/commonjs/services/linkedinScrapingService.js +230 -8
  71. package/lib/commonjs/services/llmDataStorage.js +294 -8
  72. package/lib/commonjs/services/mobileTrainingService.js +186 -8
  73. package/lib/commonjs/services/netflixDataExtractor.js +120 -8
  74. package/lib/commonjs/services/netflixDataService.js +198 -9
  75. package/lib/commonjs/services/pinEncryptionService.js +84 -8
  76. package/lib/commonjs/services/pinStorageUtils.js +105 -7
  77. package/lib/commonjs/services/platformAuthService.js +1484 -12
  78. package/lib/commonjs/services/sephoraDataExtractor.js +140 -8
  79. package/lib/commonjs/services/sephoraDataService.js +200 -9
  80. package/lib/commonjs/services/spotifyDataExtractor.js +148 -8
  81. package/lib/commonjs/services/spotifyDataService.js +241 -9
  82. package/lib/commonjs/services/storageService.js +404 -8
  83. package/lib/commonjs/services/telegramDataExtractor.js +115 -8
  84. package/lib/commonjs/services/telegramDataService.js +499 -9
  85. package/lib/commonjs/services/trainingApiHelpers.js +73 -7
  86. package/lib/commonjs/services/userConnectionsService.js +340 -10
  87. package/lib/commonjs/services/youtubeMigrationService.js +416 -10
  88. package/lib/commonjs/theme/index.js +250 -7
  89. package/lib/commonjs/types/ambient.d.js +2 -1
  90. package/lib/commonjs/types/declarations.d.js +2 -1
  91. package/lib/commonjs/types/index.js +6 -1
  92. package/lib/commonjs/types/node-fix.d.js +2 -1
  93. package/lib/commonjs/types/node-override.d.js +2 -1
  94. package/lib/commonjs/types/opacity.d.js +2 -1
  95. package/lib/commonjs/types.js +14 -1
  96. package/lib/commonjs/utils/Portal.js +98 -8
  97. package/lib/commonjs/utils/api.js +130 -9
  98. package/lib/commonjs/utils/assetRegistry.js +210 -35
  99. package/lib/commonjs/utils/auth.js +112 -9
  100. package/lib/commonjs/utils/connectorTests.js +613 -29
  101. package/lib/commonjs/utils/crypto.js +62 -8
  102. package/lib/commonjs/utils/debugHelper.js +64 -1
  103. package/lib/commonjs/utils/encryption.js +76 -7
  104. package/lib/commonjs/utils/eventUtils.js +288 -1
  105. package/lib/commonjs/utils/haptics.js +66 -9
  106. package/lib/commonjs/utils/imagePreloader.js +6 -1
  107. package/lib/commonjs/utils/networkDiagnostics.js +226 -8
  108. package/lib/commonjs/utils/onairosApi.js +350 -9
  109. package/lib/commonjs/utils/programmaticFlow.js +117 -9
  110. package/lib/commonjs/utils/retryHelper.js +220 -1
  111. package/lib/commonjs/utils/secureStorage.js +349 -10
  112. package/lib/commonjs/utils/webviewScripts/chatgpt.js +551 -1
  113. package/lib/commonjs/utils/webviewScripts/claude.js +376 -1
  114. package/lib/commonjs/utils/webviewScripts/hinge.js +411 -1
  115. package/lib/commonjs/utils/webviewScripts/index.js +698 -15
  116. package/lib/commonjs/utils/webviewScripts/instagram.js +454 -1
  117. package/lib/commonjs/utils/webviewScripts/linkedin.js +880 -1
  118. package/lib/commonjs/utils/webviewScripts/netflix.js +382 -1
  119. package/lib/commonjs/utils/webviewScripts/sephora.js +516 -1
  120. package/lib/commonjs/utils/webviewScripts/spotify.js +419 -1
  121. package/lib/commonjs/utils/webviewScripts/telegram.js +678 -1
  122. package/lib/module/api/index.js +211 -1
  123. package/lib/module/components/BodyText.js +20 -1
  124. package/lib/module/components/BrandMark.js +104 -1
  125. package/lib/module/components/CodeInput.js +109 -1
  126. package/lib/module/components/EmailInput.js +23 -1
  127. package/lib/module/components/GoogleButton.js +49 -1
  128. package/lib/module/components/HeadingGroup.js +36 -1
  129. package/lib/module/components/LLMDataInputModal.js +656 -7
  130. package/lib/module/components/ModalHeader.js +92 -1
  131. package/lib/module/components/ModalSheet.js +39 -1
  132. package/lib/module/components/Onairos.js +373 -1
  133. package/lib/module/components/OnairosButton.js +305 -1
  134. package/lib/module/components/OnairosSignInButton.js +121 -1
  135. package/lib/module/components/Overlay.js +456 -1
  136. package/lib/module/components/PersonaImage.js +129 -1
  137. package/lib/module/components/PersonaLoadingScreen.js +310 -1
  138. package/lib/module/components/PersonalizationConsentScreen.js +460 -1
  139. package/lib/module/components/PinCreationScreen.js +396 -1
  140. package/lib/module/components/PinInput.js +456 -1
  141. package/lib/module/components/PlatformConnectorsStep.js +1302 -6
  142. package/lib/module/components/PlatformList.js +129 -1
  143. package/lib/module/components/PlatformToggle.js +173 -1
  144. package/lib/module/components/PrimaryButton.js +172 -1
  145. package/lib/module/components/SignInMatchAnimation.js +189 -1
  146. package/lib/module/components/SignInStep.js +338 -1
  147. package/lib/module/components/UniversalOnboarding.js +2770 -1
  148. package/lib/module/components/VerificationStep.js +168 -1
  149. package/lib/module/components/WelcomeScreen.js +453 -1
  150. package/lib/module/components/icons/Basicproficon.js +30 -1
  151. package/lib/module/components/icons/Basicprofile.js +14 -1
  152. package/lib/module/components/icons/Checkbox.js +14 -1
  153. package/lib/module/components/icons/Checkmark.js +20 -1
  154. package/lib/module/components/icons/Contentanalysis.js +14 -1
  155. package/lib/module/components/icons/Contenticon.js +32 -1
  156. package/lib/module/components/icons/EnochE.js +34 -1
  157. package/lib/module/components/icons/Personalityicon.js +23 -1
  158. package/lib/module/components/icons/Personalityprofile.js +14 -1
  159. package/lib/module/components/icons/Personalitytraits.js +14 -1
  160. package/lib/module/components/icons/Userpreferences.js +14 -1
  161. package/lib/module/components/icons/index.js +13 -1
  162. package/lib/module/components/onboarding/OAuthWebView.js +1746 -1
  163. package/lib/module/components/onboarding/OnboardingHeader.js +66 -1
  164. package/lib/module/components/onboarding/PinInput.js +274 -1
  165. package/lib/module/components/onboarding/PlatformConnector.js +240 -1
  166. package/lib/module/config/PLATFORM_APIS.md +849 -0
  167. package/lib/module/config/api.js +47 -1
  168. package/lib/module/constants/index.js +114 -1
  169. package/lib/module/context/AuthContext.js +335 -1
  170. package/lib/module/hooks/useConnectedAccounts.js +106 -1
  171. package/lib/module/hooks/useConnections.js +95 -1
  172. package/lib/module/hooks/useCredentials.js +171 -6
  173. package/lib/module/hooks/useUserConnections.js +140 -1
  174. package/lib/module/index.js +172 -1
  175. package/lib/module/services/apiClient.js +295 -1
  176. package/lib/module/services/biometricPinService.js +169 -1
  177. package/lib/module/services/chatGPTConversationExtractor.js +149 -1
  178. package/lib/module/services/chatGPTConversationService.js +268 -1
  179. package/lib/module/services/claudeConversationExtractor.js +97 -1
  180. package/lib/module/services/claudeConversationService.js +151 -1
  181. package/lib/module/services/connectedAccountsService.js +293 -1
  182. package/lib/module/services/googleAuthService.js +241 -1
  183. package/lib/module/services/hingeDataExtractor.js +99 -1
  184. package/lib/module/services/hingeDataService.js +143 -1
  185. package/lib/module/services/imageCompressionService.js +250 -1
  186. package/lib/module/services/instagramDataExtractor.js +120 -1
  187. package/lib/module/services/instagramDataService.js +156 -1
  188. package/lib/module/services/jwtStorageService.js +257 -1
  189. package/lib/module/services/linkedinDOMExtractor.js +234 -1
  190. package/lib/module/services/linkedinProfileService.js +210 -1
  191. package/lib/module/services/linkedinScrapingService.js +219 -1
  192. package/lib/module/services/llmDataStorage.js +277 -1
  193. package/lib/module/services/mobileTrainingService.js +173 -1
  194. package/lib/module/services/netflixDataExtractor.js +114 -1
  195. package/lib/module/services/netflixDataService.js +191 -1
  196. package/lib/module/services/pinEncryptionService.js +74 -6
  197. package/lib/module/services/pinStorageUtils.js +93 -1
  198. package/lib/module/services/platformAuthService.js +1461 -1
  199. package/lib/module/services/sephoraDataExtractor.js +134 -1
  200. package/lib/module/services/sephoraDataService.js +193 -1
  201. package/lib/module/services/spotifyDataExtractor.js +142 -1
  202. package/lib/module/services/spotifyDataService.js +234 -1
  203. package/lib/module/services/storageService.js +383 -1
  204. package/lib/module/services/telegramDataExtractor.js +109 -1
  205. package/lib/module/services/telegramDataService.js +493 -1
  206. package/lib/module/services/trainingApiHelpers.js +67 -1
  207. package/lib/module/services/userConnectionsService.js +329 -1
  208. package/lib/module/services/youtubeMigrationService.js +405 -1
  209. package/lib/module/theme/index.js +245 -1
  210. package/lib/module/types.js +10 -1
  211. package/lib/module/utils/Portal.js +90 -1
  212. package/lib/module/utils/api.js +118 -1
  213. package/lib/module/utils/assetRegistry.js +200 -34
  214. package/lib/module/utils/auth.js +100 -1
  215. package/lib/module/utils/connectorTests.js +600 -27
  216. package/lib/module/utils/crypto.js +54 -1
  217. package/lib/module/utils/debugHelper.js +54 -1
  218. package/lib/module/utils/encryption.js +67 -1
  219. package/lib/module/utils/eventUtils.js +270 -1
  220. package/lib/module/utils/haptics.js +59 -8
  221. package/lib/module/utils/imagePreloader.js +3 -1
  222. package/lib/module/utils/networkDiagnostics.js +217 -1
  223. package/lib/module/utils/onairosApi.js +333 -1
  224. package/lib/module/utils/programmaticFlow.js +111 -1
  225. package/lib/module/utils/retryHelper.js +211 -1
  226. package/lib/module/utils/secureStorage.js +330 -6
  227. package/lib/module/utils/webviewScripts/chatgpt.js +545 -1
  228. package/lib/module/utils/webviewScripts/claude.js +370 -1
  229. package/lib/module/utils/webviewScripts/hinge.js +405 -1
  230. package/lib/module/utils/webviewScripts/index.js +434 -1
  231. package/lib/module/utils/webviewScripts/instagram.js +448 -1
  232. package/lib/module/utils/webviewScripts/linkedin.js +874 -1
  233. package/lib/module/utils/webviewScripts/netflix.js +376 -1
  234. package/lib/module/utils/webviewScripts/sephora.js +510 -1
  235. package/lib/module/utils/webviewScripts/spotify.js +413 -1
  236. package/lib/module/utils/webviewScripts/telegram.js +672 -1
  237. package/package.json +2 -2
@@ -1 +1,111 @@
1
- function _0x1e01(_0x30d41a,_0x1e01b5){_0x30d41a=_0x30d41a-0x0;const _0x1f9715=_0x30d4();let _0xf77c83=_0x1f9715[_0x30d41a];return _0xf77c83;}import{initializePlatformAuthService}from'../services/platformAuthService';export const executeOnairosFlow=async _0x4e17d3=>{const _0x18c563={'MFdQg':'❌\x20Onairos\x20flow\x20rejected:','gEUpe':function(_0x43109e,_0x15deda){return _0x43109e!==_0x15deda;},'UFvOF':'RXiwm','JduuE':function(_0x22ed50,_0x554387){return _0x22ed50(_0x554387);},'cGMdU':function(_0x420261,_0x428cb7){return _0x420261||_0x428cb7;},'tnZqX':_0x1e01(0x0),'TkoIM':_0x1e01(0x1),'YPauj':_0x1e01(0x2),'FRomI':function(_0x272a99){return _0x272a99();},'YABir':_0x1e01(0x3),'BQJLd':'iNOkV','LwuHs':'tLyay','DCaLw':_0x1e01(0x4),'qqnOM':_0x1e01(0x5),'uUrYK':function(_0x51851d){return _0x51851d();},'cLlKv':'../components/UniversalOnboarding','SRowC':_0x1e01(0x6)};try{console['log'](_0x18c563['qqnOM']),await _0x18c563['uUrYK'](initializePlatformAuthService);const {UniversalOnboarding:_0x38645c}=await import(_0x18c563[_0x1e01(0x7)]),React=await import('react');return new Promise((_0x34537f,_0x10f7a2)=>{const _0x1106b9={'PxRTM':_0x18c563[_0x1e01(0x8)],'dOzdE':function(_0x165f44,_0x190d46){return _0x18c563['gEUpe'](_0x165f44,_0x190d46);},'STafn':_0x18c563[_0x1e01(0x9)],'WezHZ':function(_0x1b2e13){return _0x18c563[_0x1e01(0xa)](_0x1b2e13);},'scRVf':_0x18c563[_0x1e01(0xb)]};if(_0x18c563[_0x1e01(0xc)](_0x18c563[_0x1e01(0xd)],_0x18c563[_0x1e01(0xe)])){let _0x115e3c=null;const _0x10a59f=(_0x1b8ff2,_0x1f6189,_0x25d6b7)=>{console[_0x1e01(0xf)](_0x1106b9['PxRTM']),_0x115e3c&&_0x115e3c['close']&&_0x115e3c[_0x1e01(0x10)](),_0x4e17d3[_0x1e01(0x11)]&&(_0x1106b9['dOzdE'](_0x1106b9['STafn'],_0x1106b9[_0x1e01(0x12)])?_0x27a4bb[_0x1e01(0x10)]():_0x4e17d3[_0x1e01(0x11)](_0x1b8ff2,_0x1f6189,_0x25d6b7)),_0x1106b9[_0x1e01(0x13)](_0x34537f);},_0x139771=_0x5af1bf=>{console[_0x1e01(0xf)](_0x18c563['MFdQg'],_0x5af1bf),_0x115e3c&&_0x115e3c['close']&&_0x115e3c[_0x1e01(0x10)](),_0x4e17d3['onRejection']&&(_0x18c563[_0x1e01(0xc)](_0x18c563['UFvOF'],_0x18c563[_0x1e01(0x14)])?(_0x57a3bd['log'](_0x1e01(0x1)),_0x27b1f7&&_0x304613[_0x1e01(0x10)]&&_0x1d8bd1[_0x1e01(0x10)](),_0x1f0509['onResolved']&&_0x359c54[_0x1e01(0x11)](_0x3eb081,_0x427a04,_0x395eeb),_0x1fe295()):_0x4e17d3[_0x1e01(0x15)](_0x5af1bf)),_0x18c563['JduuE'](_0x10f7a2,new Error(_0x18c563[_0x1e01(0x16)](_0x5af1bf,_0x18c563[_0x1e01(0x17)])));},_0x2a25b8=React[_0x1e01(0x18)](_0x38645c,{'visible':!![],'onClose':()=>_0x139771(_0x1e01(0x19)),'AppName':_0x4e17d3[_0x1e01(0x1a)],'requestData':_0x4e17d3['requestData'],'returnLink':_0x4e17d3[_0x1e01(0x1b)],'onComplete':_0x10a59f,'preferredPlatform':_0x4e17d3['preferredPlatform'],'debug':_0x4e17d3[_0x1e01(0x1c)],'testMode':_0x4e17d3[_0x1e01(0x1d)]});_0x115e3c=_0x2a25b8,console[_0x1e01(0xf)](_0x18c563['DCaLw']);}else _0xee66aa[_0x1e01(0x15)](_0x1106b9[_0x1e01(0x1e)]);});}catch(_0x4bd078){console[_0x1e01(0x1f)](_0x18c563[_0x1e01(0x20)],_0x4bd078);throw _0x4bd078;}};export const startOnairosFlow=async _0xaae838=>{const _0x243d07={'cfnME':function(_0x1f5052,_0x4fe56c){return _0x1f5052===_0x4fe56c;},'yTWAP':_0x1e01(0x21),'EvEwe':_0x1e01(0x22)};if(_0xaae838[_0x1e01(0x23)]){if(_0x243d07[_0x1e01(0x24)](_0x243d07[_0x1e01(0x25)],'sRnUA')){const _0x35a9c9=await _0xaae838[_0x1e01(0x23)]();if(!_0x35a9c9){console[_0x1e01(0xf)](_0x243d07['EvEwe']);_0xaae838[_0x1e01(0x15)]&&_0xaae838[_0x1e01(0x15)](_0x1e01(0x3));return;}}else _0x177dcc[_0x1e01(0x11)](_0x67cf12,_0x7418ce,_0x3e2db2);}return executeOnairosFlow(_0xaae838);};function _0x30d4(){const _0xaa82c2=['Onairos\x20flow\x20was\x20rejected','✅\x20Onairos\x20flow\x20completed\x20successfully','iqWrJ','Pre-check\x20failed','📱\x20Onairos\x20modal\x20should\x20be\x20displayed','🚀\x20Starting\x20Onairos\x20flow\x20programmatically...','❌\x20Failed\x20to\x20execute\x20Onairos\x20flow:','cLlKv','TkoIM','YPauj','FRomI','YABir','gEUpe','BQJLd','LwuHs','log','close','onResolved','STafn','WezHZ','UFvOF','onRejection','cGMdU','tnZqX','createElement','User\x20closed\x20the\x20modal','AppName','returnLink','debug','testMode','scRVf','error','SRowC','sRnUA','❌\x20Pre-check\x20failed,\x20not\x20starting\x20Onairos\x20flow','preCheck','cfnME','yTWAP'];_0x30d4=function(){return _0xaa82c2;};return _0x30d4();}
1
+ /**
2
+ * Programmatic Onairos Flow
3
+ *
4
+ * This function executes the complete Onairos authentication and onboarding flow
5
+ * that can be attached to custom buttons or called programmatically.
6
+ */
7
+
8
+ import { initializePlatformAuthService } from '../services/platformAuthService';
9
+
10
+ /**
11
+ * Execute the complete Onairos flow programmatically
12
+ * This is the same logic that the OnairosButton uses internally
13
+ *
14
+ * @param options Configuration options for the flow
15
+ * @returns Promise that resolves when flow is complete
16
+ */
17
+ export const executeOnairosFlow = async options => {
18
+ try {
19
+ console.log('🚀 Starting Onairos flow programmatically...');
20
+
21
+ // Initialize API key service if not already initialized
22
+ await initializePlatformAuthService();
23
+
24
+ // Import components dynamically to avoid circular dependencies
25
+ const {
26
+ UniversalOnboarding
27
+ } = await import('../components/UniversalOnboarding');
28
+ const React = await import('react');
29
+
30
+ // Create a promise that resolves when the flow is complete
31
+ return new Promise((resolve, reject) => {
32
+ let modalRef = null;
33
+ const handleComplete = (apiUrl, token, userData) => {
34
+ console.log('✅ Onairos flow completed successfully');
35
+
36
+ // Clean up modal
37
+ if (modalRef && modalRef.close) {
38
+ modalRef.close();
39
+ }
40
+
41
+ // Call user's onResolved callback
42
+ if (options.onResolved) {
43
+ options.onResolved(apiUrl, token, userData);
44
+ }
45
+ resolve();
46
+ };
47
+ const handleRejection = error => {
48
+ console.log('❌ Onairos flow rejected:', error);
49
+
50
+ // Clean up modal
51
+ if (modalRef && modalRef.close) {
52
+ modalRef.close();
53
+ }
54
+
55
+ // Call user's onRejection callback
56
+ if (options.onRejection) {
57
+ options.onRejection(error);
58
+ }
59
+ reject(new Error(error || 'Onairos flow was rejected'));
60
+ };
61
+
62
+ // Create and show the Universal Onboarding modal
63
+ const modalElement = React.createElement(UniversalOnboarding, {
64
+ visible: true,
65
+ onClose: () => handleRejection('User closed the modal'),
66
+ AppName: options.AppName,
67
+ requestData: options.requestData,
68
+ returnLink: options.returnLink,
69
+ onComplete: handleComplete,
70
+ preferredPlatform: options.preferredPlatform,
71
+ debug: options.debug,
72
+ testMode: options.testMode
73
+ });
74
+
75
+ // Store modal reference for cleanup
76
+ modalRef = modalElement;
77
+
78
+ // Note: In a real implementation, you'd need to render this modal
79
+ // This is a simplified version - the actual implementation would
80
+ // need to handle React rendering in the current app context
81
+ console.log('📱 Onairos modal should be displayed');
82
+ });
83
+ } catch (error) {
84
+ console.error('❌ Failed to execute Onairos flow:', error);
85
+ throw error;
86
+ }
87
+ };
88
+
89
+ /**
90
+ * Simple wrapper function that matches the OnairosButton click behavior
91
+ *
92
+ * @param options Configuration options for the flow
93
+ * @returns Promise that resolves when flow is complete
94
+ */
95
+ export const startOnairosFlow = async options => {
96
+ // Pre-check if provided
97
+ if (options.preCheck) {
98
+ const canProceed = await options.preCheck();
99
+ if (!canProceed) {
100
+ console.log('❌ Pre-check failed, not starting Onairos flow');
101
+ if (options.onRejection) {
102
+ options.onRejection('Pre-check failed');
103
+ }
104
+ return;
105
+ }
106
+ }
107
+
108
+ // Execute the flow
109
+ return executeOnairosFlow(options);
110
+ };
111
+ //# sourceMappingURL=programmaticFlow.js.map
@@ -1 +1,211 @@
1
- function _0x1844(_0x21065c,_0x1844a5){_0x21065c=_0x21065c-0x0;const _0x156f84=_0x2106();let _0x8ad93d=_0x156f84[_0x21065c];return _0x8ad93d;}function _0x2106(){const _0x249ace=['AbortError','Network\x20request\x20failed','fetch','timeout','JSON\x20Parse\x20error','Unexpected\x20character','status','ZqgfO','name','wwaPS','message','includes','uLirR','DPzpb','joazS','NBvsw','log','⏳\x20Waiting\x20','eQIbv','maxRetries','pwApO','xKTuc','UYDco','kIAxl','now','sZLEc','tqKwZ','fdYcp','sUXVV','aTgCj','UFUMS','shouldRetry','TOvpQ','enableLogging','❌\x20All\x20retry\x20attempts\x20exhausted\x20or\x20error\x20not\x20retryable:\x20','baseDelay','exponentialBackoff','XFqJE','DGdsb','MsyWV','min','WzbYD','pow','EcVeG','maxDelay','sbdVw','uAXLq','HaiUv','dgAeB','LRsQX','HyQun','phtaL','ENOTFOUND','xkXSF','random','floor','onRetry','xKgII','error','IdoVt','VEJTV','HTML\x20page\x20instead\x20of\x20JSON','xgRwu','CwLTM','HmQuh','aCnWL','XCUNH','AIBlx','SdvUJ','GyXOg','warn','⚠️\x20API\x20call\x20failed\x20(attempt\x20','),\x20retrying\x20in\x20','ms:\x20','Ahewd','DNS','aAbCj','eMpkj','data','OnairosReactNative/HealthCheck','lHCIh','RdEWL','abort','signal','DrfHf','LdRRc','NUUEB','wZTQs','kYsWF','srFMB','QLagj'];_0x2106=function(){return _0x249ace;};return _0x2106();}export const DEFAULT_RETRY_OPTIONS={'maxRetries':0x3,'baseDelay':0x3e8,'maxDelay':0x1388,'exponentialBackoff':!![],'enableLogging':![],'shouldRetry':(_0x21e013,_0x116a4b)=>{const _0x5eaf25={'eQIbv':function(_0x5d0110,_0x19e4fc){return _0x5d0110+_0x19e4fc;},'ZqgfO':function(_0x2fa666,_0x55bc3d){return _0x2fa666<_0x55bc3d;},'XzNwa':function(_0x2ec225,_0x58729a){return _0x2ec225!==_0x58729a;},'wwaPS':_0x1844(0x0),'vWOux':_0x1844(0x1),'nXIge':_0x1844(0x2),'rXucA':'ENOTFOUND','uLirR':_0x1844(0x3),'SDfiS':_0x1844(0x4),'DPzpb':_0x1844(0x5),'joazS':function(_0x43d501,_0x387239){return _0x43d501!==_0x387239;},'NAvrj':'cZSqh'};if(_0x21e013[_0x1844(0x6)]>=0x190&&_0x5eaf25[_0x1844(0x7)](_0x21e013[_0x1844(0x6)],0x1f4)&&_0x5eaf25['XzNwa'](_0x21e013[_0x1844(0x6)],0x198)&&_0x5eaf25['XzNwa'](_0x21e013[_0x1844(0x6)],0x1ad))return![];if(_0x21e013[_0x1844(0x8)]===_0x5eaf25[_0x1844(0x9)]||_0x21e013[_0x1844(0xa)][_0x1844(0xb)](_0x5eaf25['vWOux'])||_0x21e013[_0x1844(0xa)][_0x1844(0xb)](_0x5eaf25['nXIge'])||_0x21e013[_0x1844(0xa)][_0x1844(0xb)](_0x5eaf25['rXucA'])||_0x21e013[_0x1844(0xa)]['includes'](_0x5eaf25[_0x1844(0xc)])||_0x21e013[_0x1844(0x6)]>=0x1f4)return!![];if(_0x21e013[_0x1844(0xa)][_0x1844(0xb)](_0x5eaf25['SDfiS'])||_0x21e013[_0x1844(0xa)][_0x1844(0xb)](_0x5eaf25[_0x1844(0xd)])){if(_0x5eaf25[_0x1844(0xe)](_0x5eaf25['NAvrj'],_0x1844(0xf)))return!![];else _0x4e7435[_0x1844(0x10)](_0x1844(0x11)+_0x5cf948+'ms\x20before\x20retry\x20(attempt\x20'+_0x4fa3e5+'/'+_0x5eaf25[_0x1844(0x12)](_0x53b5da[_0x1844(0x13)],0x1)+')');}return![];}};export async function withRetry(_0x4e26d4,_0x3937fe={}){const _0x2d2be0={'MazLb':function(_0x4ffbcc,_0x52dcdd){return _0x4ffbcc<=_0x52dcdd;},'sbdVw':function(_0x1dd87f,_0x4af9a5){return _0x1dd87f>=_0x4af9a5;},'uAXLq':function(_0x4535a7,_0x98c1f6){return _0x4535a7<_0x98c1f6;},'HaiUv':function(_0x2d96a6,_0x44fcf1){return _0x2d96a6!==_0x44fcf1;},'dgAeB':function(_0x3851cc,_0x5973ff){return _0x3851cc===_0x5973ff;},'LRsQX':_0x1844(0x0),'HyQun':'Network\x20request\x20failed','phtaL':_0x1844(0x2),'CXnBB':_0x1844(0x3),'xkXSF':_0x1844(0x5),'sZLEc':function(_0x396853,_0xfd554f){return _0x396853<=_0xfd554f;},'tqKwZ':_0x1844(0x14),'ONtJW':function(_0x1cbe70,_0x5e01e4){return _0x1cbe70>_0x5e01e4;},'fdYcp':function(_0x35e8f4,_0x52cac6){return _0x35e8f4+_0x52cac6;},'Klmwr':function(_0x12808){return _0x12808();},'sUXVV':function(_0x14b909,_0x593fbc){return _0x14b909-_0x593fbc;},'aTgCj':function(_0xe6ad79,_0x43337b){return _0xe6ad79===_0x43337b;},'UFUMS':_0x1844(0x15),'TOvpQ':function(_0x149b9a,_0x1db532){return _0x149b9a>_0x1db532;},'XFqJE':function(_0x3ff67e,_0x3cffb7){return _0x3ff67e!==_0x3cffb7;},'DGdsb':_0x1844(0x16),'MsyWV':'IlABD','WzbYD':function(_0x31d267,_0x49edae){return _0x31d267*_0x49edae;},'EcVeG':function(_0x2af421,_0x1196d8){return _0x2af421-_0x1196d8;},'xKgII':_0x1844(0x17),'oeicU':function(_0x2c08ed,_0x42beb2){return _0x2c08ed+_0x42beb2;},'IdoVt':function(_0x2f8bfe,_0xe54a1f){return _0x2f8bfe-_0xe54a1f;}},_0x1540e2={...DEFAULT_RETRY_OPTIONS,..._0x3937fe},_0x2e3ae0=Date[_0x1844(0x18)]();let _0x426849=null;for(let _0x2dce36=0x1;_0x2d2be0[_0x1844(0x19)](_0x2dce36,_0x1540e2[_0x1844(0x13)]+0x1);_0x2dce36++){try{if(_0x2d2be0['dgAeB'](_0x2d2be0[_0x1844(0x1a)],_0x2d2be0[_0x1844(0x1a)])){_0x1540e2['enableLogging']&&_0x2d2be0['ONtJW'](_0x2dce36,0x1)&&console[_0x1844(0x10)]('🔄\x20Retry\x20attempt\x20'+_0x2dce36+'/'+_0x2d2be0[_0x1844(0x1b)](_0x1540e2[_0x1844(0x13)],0x1));const _0x300584=await _0x2d2be0['Klmwr'](_0x4e26d4);return{'success':!![],'data':_0x300584,'attempts':_0x2dce36,'totalDuration':_0x2d2be0[_0x1844(0x1c)](Date['now'](),_0x2e3ae0)};}else return _0x2d2be0['MazLb'](_0x290ce4,0x2);}catch(_0x41cd47){if(_0x2d2be0[_0x1844(0x1d)](_0x2d2be0[_0x1844(0x1e)],_0x2d2be0[_0x1844(0x1e)])){_0x426849=_0x41cd47;const _0x6de8f5=_0x1540e2[_0x1844(0x1f)]?_0x1540e2[_0x1844(0x1f)](_0x41cd47,_0x2dce36):!![];if(_0x2d2be0[_0x1844(0x20)](_0x2dce36,_0x1540e2[_0x1844(0x13)])||!_0x6de8f5){_0x1540e2[_0x1844(0x21)]&&console['error'](_0x1844(0x22)+_0x41cd47['message']);break;}let _0x58d6d6=_0x1540e2[_0x1844(0x23)];if(_0x1540e2[_0x1844(0x24)]){if(_0x2d2be0[_0x1844(0x25)](_0x2d2be0[_0x1844(0x26)],_0x2d2be0[_0x1844(0x27)]))_0x58d6d6=Math[_0x1844(0x28)](_0x2d2be0[_0x1844(0x29)](_0x1540e2[_0x1844(0x23)],Math[_0x1844(0x2a)](0x2,_0x2d2be0[_0x1844(0x2b)](_0x2dce36,0x1))),_0x1540e2[_0x1844(0x2c)]);else{if(_0x2d2be0[_0x1844(0x2d)](_0x4a1d00[_0x1844(0x6)],0x190)&&_0x2d2be0[_0x1844(0x2e)](_0x5d3b53[_0x1844(0x6)],0x1f4)&&_0x2d2be0[_0x1844(0x2f)](_0x28812e['status'],0x198)&&_0x2d2be0[_0x1844(0x2f)](_0x213779[_0x1844(0x6)],0x1ad))return![];if(_0x2d2be0[_0x1844(0x30)](_0x3787f7['name'],_0x2d2be0[_0x1844(0x31)])||_0x385ea4[_0x1844(0xa)][_0x1844(0xb)](_0x2d2be0[_0x1844(0x32)])||_0x35fffa[_0x1844(0xa)][_0x1844(0xb)](_0x2d2be0[_0x1844(0x33)])||_0x4567a5['message'][_0x1844(0xb)](_0x1844(0x34))||_0x266d14[_0x1844(0xa)][_0x1844(0xb)](_0x2d2be0['CXnBB'])||_0x13a26d['status']>=0x1f4)return!![];if(_0x21924f['message']['includes']('JSON\x20Parse\x20error')||_0x1d4500[_0x1844(0xa)][_0x1844(0xb)](_0x2d2be0[_0x1844(0x35)]))return!![];return![];}}const _0x467cc4=_0x2d2be0[_0x1844(0x29)](Math[_0x1844(0x36)](),0.1)*_0x58d6d6;_0x58d6d6=Math[_0x1844(0x37)](_0x58d6d6+_0x467cc4),_0x1540e2['onRetry']&&_0x1540e2[_0x1844(0x38)](_0x41cd47,_0x2dce36,_0x58d6d6),_0x1540e2[_0x1844(0x21)]&&(_0x2d2be0[_0x1844(0x30)](_0x2d2be0[_0x1844(0x39)],_0x2d2be0['xKgII'])?console[_0x1844(0x10)](_0x1844(0x11)+_0x58d6d6+'ms\x20before\x20retry\x20(attempt\x20'+_0x2dce36+'/'+_0x2d2be0['oeicU'](_0x1540e2[_0x1844(0x13)],0x1)+')'):_0x5288ab[_0x1844(0x3a)]('❌\x20All\x20retry\x20attempts\x20exhausted\x20or\x20error\x20not\x20retryable:\x20'+_0x13e450[_0x1844(0xa)])),await new Promise(_0x11a60d=>setTimeout(()=>_0x11a60d(),_0x58d6d6));}else return!![];}}return{'success':![],'error':_0x426849||new Error('Unknown\x20error'),'attempts':_0x2d2be0['fdYcp'](_0x1540e2['maxRetries'],0x1),'totalDuration':_0x2d2be0[_0x1844(0x3b)](Date[_0x1844(0x18)](),_0x2e3ae0)};}export const API_RETRY_OPTIONS={'maxRetries':0x3,'baseDelay':0x3e8,'maxDelay':0x1388,'exponentialBackoff':!![],'shouldRetry':(_0x30ea96,_0x25c305)=>{const _0xfb2264={'hzqBY':function(_0x25ea6e,_0x1a0bc8){return _0x25ea6e+_0x1a0bc8;},'USLSR':function(_0x376bcd,_0x119f07){return _0x376bcd===_0x119f07;},'xgRwu':function(_0x28102c,_0x11d61e){return _0x28102c===_0x11d61e;},'CwLTM':function(_0x353236,_0x3791e1){return _0x353236<=_0x3791e1;},'HmQuh':function(_0x5e3ea5,_0x1f99e6){return _0x5e3ea5>=_0x1f99e6;},'aCnWL':function(_0x1a7f93,_0x571705){return _0x1a7f93===_0x571705;},'rhOZR':_0x1844(0x0),'XCUNH':_0x1844(0x2),'AIBlx':_0x1844(0x3c),'SdvUJ':_0x1844(0x5),'GyXOg':_0x1844(0x3d)};if(_0xfb2264['USLSR'](_0x30ea96[_0x1844(0x6)],0x191)||_0x30ea96[_0x1844(0x6)]===0x193)return![];if(_0x30ea96[_0x1844(0x6)]===0x190||_0xfb2264[_0x1844(0x3e)](_0x30ea96[_0x1844(0x6)],0x194)&&!_0x30ea96[_0x1844(0xa)][_0x1844(0xb)]('validation\x20endpoint'))return![];if(_0x30ea96[_0x1844(0x6)]===0x1ad)return _0xfb2264[_0x1844(0x3f)](_0x25c305,0x2);if(_0xfb2264[_0x1844(0x40)](_0x30ea96[_0x1844(0x6)],0x1f4))return!![];if(_0xfb2264[_0x1844(0x41)](_0x30ea96[_0x1844(0x8)],_0xfb2264['rhOZR'])||_0x30ea96['message'][_0x1844(0xb)](_0x1844(0x3))||_0x30ea96['message'][_0x1844(0xb)]('Network\x20request\x20failed')||_0x30ea96[_0x1844(0xa)][_0x1844(0xb)](_0xfb2264[_0x1844(0x42)])||_0x30ea96[_0x1844(0xa)][_0x1844(0xb)](_0x1844(0x34))){if(_0xfb2264[_0x1844(0x43)]!==_0x1844(0x3c))_0xea999d[_0x1844(0x10)]('🔄\x20Retry\x20attempt\x20'+_0x30da3b+'/'+_0xfb2264['hzqBY'](_0x5e1955[_0x1844(0x13)],0x1));else return!![];}if(_0x30ea96[_0x1844(0xa)]['includes'](_0x1844(0x4))||_0x30ea96['message']['includes'](_0xfb2264[_0x1844(0x44)])||_0x30ea96[_0x1844(0xa)][_0x1844(0xb)](_0xfb2264[_0x1844(0x45)]))return!![];return![];},'onRetry':(_0x4d9df4,_0x18163e,_0x41d7b8)=>{console[_0x1844(0x46)](_0x1844(0x47)+_0x18163e+_0x1844(0x48)+_0x41d7b8+_0x1844(0x49)+_0x4d9df4[_0x1844(0xa)]);}};export const NETWORK_RETRY_OPTIONS={'maxRetries':0x2,'baseDelay':0x7d0,'maxDelay':0x1f40,'exponentialBackoff':!![],'shouldRetry':(_0x4b3705,_0x5ce6ce)=>{const _0x3e9691={'Ahewd':_0x1844(0x1),'HdUjE':_0x1844(0x34),'aAbCj':function(_0x2224bb,_0x17a7dd){return _0x2224bb===_0x17a7dd;}};return _0x4b3705[_0x1844(0xa)]['includes'](_0x3e9691[_0x1844(0x4a)])||_0x4b3705[_0x1844(0xa)][_0x1844(0xb)](_0x3e9691['HdUjE'])||_0x4b3705[_0x1844(0xa)][_0x1844(0xb)](_0x1844(0x4b))||_0x3e9691[_0x1844(0x4c)](_0x4b3705[_0x1844(0x8)],_0x1844(0x0));}};export async function fetchWithRetry(_0x46c1c3,_0x3134bd={},_0x51108f=API_RETRY_OPTIONS){const _0x457b3e={'eMpkj':function(_0x43d7c7,_0x33113a,_0x192088){return _0x43d7c7(_0x33113a,_0x192088);}},_0x1ace78=await _0x457b3e[_0x1844(0x4d)](withRetry,()=>fetch(_0x46c1c3,_0x3134bd),_0x51108f);if(!_0x1ace78['success'])throw _0x1ace78[_0x1844(0x3a)];return _0x1ace78[_0x1844(0x4e)];}export async function healthCheck(_0x1d47a7,_0x337a35=0x1388){const _0x1db7d2={'RdEWL':function(_0x3423ff,_0x1c85c2,_0x5ca832){return _0x3423ff(_0x1c85c2,_0x5ca832);},'DrfHf':_0x1844(0x4f),'LdRRc':function(_0x2dfa1c,_0x2f0b32){return _0x2dfa1c(_0x2f0b32);},'NUUEB':function(_0x3d077b,_0x25bf5b){return _0x3d077b-_0x25bf5b;},'wZTQs':function(_0x3ecaa6,_0x2b6357){return _0x3ecaa6!==_0x2b6357;},'srFMB':_0x1844(0x50),'QLagj':function(_0x1fa040,_0xaf9740){return _0x1fa040-_0xaf9740;}},_0x110199=Date[_0x1844(0x18)]();try{const _0x4be014=new AbortController(),_0x3a418f=_0x1db7d2[_0x1844(0x51)](setTimeout,()=>_0x4be014[_0x1844(0x52)](),_0x337a35),_0x593f1e=await _0x1db7d2[_0x1844(0x51)](fetch,_0x1d47a7,{'method':'GET','signal':_0x4be014[_0x1844(0x53)],'headers':{'User-Agent':_0x1db7d2[_0x1844(0x54)]}});return _0x1db7d2[_0x1844(0x55)](clearTimeout,_0x3a418f),{'reachable':!![],'status':_0x593f1e['status'],'duration':_0x1db7d2[_0x1844(0x56)](Date[_0x1844(0x18)](),_0x110199)};}catch(_0x505a4c){if(_0x1db7d2[_0x1844(0x57)](_0x1844(0x58),_0x1db7d2[_0x1844(0x59)]))return{'reachable':![],'error':_0x505a4c[_0x1844(0xa)],'duration':_0x1db7d2[_0x1844(0x5a)](Date['now'](),_0x110199)};else _0x12a294[_0x1844(0x38)](_0x3c75c5,_0x225dd4,_0x275d13);}}
1
+ /**
2
+ * 🔄 Retry Helper Utility
3
+ *
4
+ * Provides robust retry logic with exponential backoff for network operations.
5
+ * Used throughout the Onairos SDK for handling transient failures gracefully.
6
+ */
7
+
8
+ /**
9
+ * Default retry options for the Onairos SDK
10
+ */
11
+ export const DEFAULT_RETRY_OPTIONS = {
12
+ maxRetries: 3,
13
+ baseDelay: 1000,
14
+ maxDelay: 5000,
15
+ exponentialBackoff: true,
16
+ enableLogging: false,
17
+ shouldRetry: (error, attempt) => {
18
+ // Don't retry client errors (4xx) except for 408 (timeout) and 429 (rate limit)
19
+ if (error.status >= 400 && error.status < 500 && error.status !== 408 && error.status !== 429) {
20
+ return false;
21
+ }
22
+
23
+ // Retry network errors, timeouts, and server errors (5xx)
24
+ if (error.name === 'AbortError' || error.message.includes('Network request failed') || error.message.includes('fetch') || error.message.includes('ENOTFOUND') || error.message.includes('timeout') || error.status >= 500) {
25
+ return true;
26
+ }
27
+
28
+ // Retry JSON parse errors (likely server issues)
29
+ if (error.message.includes('JSON Parse error') || error.message.includes('Unexpected character')) {
30
+ return true;
31
+ }
32
+ return false;
33
+ }
34
+ };
35
+
36
+ /**
37
+ * Execute a function with retry logic and exponential backoff
38
+ * @param fn Function to execute (should return a Promise)
39
+ * @param options Retry configuration options
40
+ * @returns Promise with retry result
41
+ */
42
+ export async function withRetry(fn, options = {}) {
43
+ const config = {
44
+ ...DEFAULT_RETRY_OPTIONS,
45
+ ...options
46
+ };
47
+ const startTime = Date.now();
48
+ let lastError = null;
49
+ for (let attempt = 1; attempt <= config.maxRetries + 1; attempt++) {
50
+ try {
51
+ if (config.enableLogging && attempt > 1) {
52
+ console.log(`🔄 Retry attempt ${attempt}/${config.maxRetries + 1}`);
53
+ }
54
+ const result = await fn();
55
+ return {
56
+ success: true,
57
+ data: result,
58
+ attempts: attempt,
59
+ totalDuration: Date.now() - startTime
60
+ };
61
+ } catch (error) {
62
+ lastError = error;
63
+
64
+ // Check if we should retry this error
65
+ const shouldRetryError = config.shouldRetry ? config.shouldRetry(error, attempt) : true;
66
+
67
+ // If this is the last attempt or we shouldn't retry, throw the error
68
+ if (attempt > config.maxRetries || !shouldRetryError) {
69
+ if (config.enableLogging) {
70
+ console.error(`❌ All retry attempts exhausted or error not retryable: ${error.message}`);
71
+ }
72
+ break;
73
+ }
74
+
75
+ // Calculate delay for next attempt
76
+ let delay = config.baseDelay;
77
+ if (config.exponentialBackoff) {
78
+ delay = Math.min(config.baseDelay * Math.pow(2, attempt - 1), config.maxDelay);
79
+ }
80
+
81
+ // Add some jitter to prevent thundering herd
82
+ const jitter = Math.random() * 0.1 * delay;
83
+ delay = Math.floor(delay + jitter);
84
+ if (config.onRetry) {
85
+ config.onRetry(error, attempt, delay);
86
+ }
87
+ if (config.enableLogging) {
88
+ console.log(`⏳ Waiting ${delay}ms before retry (attempt ${attempt}/${config.maxRetries + 1})`);
89
+ }
90
+
91
+ // Wait before next attempt
92
+ await new Promise(resolve => setTimeout(() => resolve(), delay));
93
+ }
94
+ }
95
+ return {
96
+ success: false,
97
+ error: lastError || new Error('Unknown error'),
98
+ attempts: config.maxRetries + 1,
99
+ totalDuration: Date.now() - startTime
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Retry configuration for API calls
105
+ */
106
+ export const API_RETRY_OPTIONS = {
107
+ maxRetries: 3,
108
+ baseDelay: 1000,
109
+ maxDelay: 5000,
110
+ exponentialBackoff: true,
111
+ shouldRetry: (error, attempt) => {
112
+ // Enhanced retry logic for API calls
113
+
114
+ // Never retry authentication errors (401) or permission errors (403)
115
+ if (error.status === 401 || error.status === 403) {
116
+ return false;
117
+ }
118
+
119
+ // Never retry bad request errors (400) or not found (404) unless it's a specific case
120
+ if (error.status === 400 || error.status === 404 && !error.message.includes('validation endpoint')) {
121
+ return false;
122
+ }
123
+
124
+ // Retry rate limiting (429) with longer delays
125
+ if (error.status === 429) {
126
+ return attempt <= 2; // Limit retries for rate limiting
127
+ }
128
+
129
+ // Retry server errors (5xx)
130
+ if (error.status >= 500) {
131
+ return true;
132
+ }
133
+
134
+ // Retry timeout and network errors
135
+ if (error.name === 'AbortError' || error.message.includes('timeout') || error.message.includes('Network request failed') || error.message.includes('fetch') || error.message.includes('ENOTFOUND')) {
136
+ return true;
137
+ }
138
+
139
+ // Retry JSON parse errors (server returning HTML instead of JSON)
140
+ if (error.message.includes('JSON Parse error') || error.message.includes('Unexpected character') || error.message.includes('HTML page instead of JSON')) {
141
+ return true;
142
+ }
143
+ return false;
144
+ },
145
+ onRetry: (error, attempt, delay) => {
146
+ console.warn(`⚠️ API call failed (attempt ${attempt}), retrying in ${delay}ms: ${error.message}`);
147
+ }
148
+ };
149
+
150
+ /**
151
+ * Specialized retry for network/connectivity issues
152
+ */
153
+ export const NETWORK_RETRY_OPTIONS = {
154
+ maxRetries: 2,
155
+ baseDelay: 2000,
156
+ maxDelay: 8000,
157
+ exponentialBackoff: true,
158
+ shouldRetry: (error, attempt) => {
159
+ // Only retry actual network/connectivity issues
160
+ return error.message.includes('Network request failed') || error.message.includes('ENOTFOUND') || error.message.includes('DNS') || error.name === 'AbortError';
161
+ }
162
+ };
163
+
164
+ /**
165
+ * Create a retry wrapper for fetch requests
166
+ * @param url Request URL
167
+ * @param options Fetch options
168
+ * @param retryOptions Retry configuration
169
+ * @returns Promise with fetch response
170
+ */
171
+ export async function fetchWithRetry(url, options = {}, retryOptions = API_RETRY_OPTIONS) {
172
+ const result = await withRetry(() => fetch(url, options), retryOptions);
173
+ if (!result.success) {
174
+ throw result.error;
175
+ }
176
+ return result.data;
177
+ }
178
+
179
+ /**
180
+ * Health check function with retry for testing connectivity
181
+ * @param url URL to check
182
+ * @param timeout Timeout in milliseconds
183
+ * @returns Promise indicating if the service is reachable
184
+ */
185
+ export async function healthCheck(url, timeout = 5000) {
186
+ const startTime = Date.now();
187
+ try {
188
+ const controller = new AbortController();
189
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
190
+ const response = await fetch(url, {
191
+ method: 'GET',
192
+ signal: controller.signal,
193
+ headers: {
194
+ 'User-Agent': 'OnairosReactNative/HealthCheck'
195
+ }
196
+ });
197
+ clearTimeout(timeoutId);
198
+ return {
199
+ reachable: true,
200
+ status: response.status,
201
+ duration: Date.now() - startTime
202
+ };
203
+ } catch (error) {
204
+ return {
205
+ reachable: false,
206
+ error: error.message,
207
+ duration: Date.now() - startTime
208
+ };
209
+ }
210
+ }
211
+ //# sourceMappingURL=retryHelper.js.map