@oxyhq/services 22.12.4 → 22.12.7

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 (639) hide show
  1. package/README.md +16 -46
  2. package/lib/commonjs/index.js +84 -10
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/notifications/deviceNotifications.js +380 -0
  5. package/lib/commonjs/notifications/deviceNotifications.js.map +1 -0
  6. package/lib/commonjs/ui/boot/runProviderColdBoot.js +51 -9
  7. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  8. package/lib/commonjs/ui/client.js +0 -13
  9. package/lib/commonjs/ui/client.js.map +1 -1
  10. package/lib/commonjs/ui/components/AvatarCameraBadge.js +3 -2
  11. package/lib/commonjs/ui/components/AvatarCameraBadge.js.map +1 -1
  12. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js +14 -3
  13. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js.map +1 -1
  14. package/lib/commonjs/ui/components/OxyAuthChooser.js +70 -1121
  15. package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
  16. package/lib/commonjs/ui/components/OxyConsentScreen.js +50 -12
  17. package/lib/commonjs/ui/components/OxyConsentScreen.js.map +1 -1
  18. package/lib/commonjs/ui/components/OxyProvider.js +4 -4
  19. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  20. package/lib/commonjs/ui/components/OxySignInButton.js +74 -40
  21. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  22. package/lib/commonjs/ui/components/OxySignInRequestSurface.js +147 -0
  23. package/lib/commonjs/ui/components/OxySignInRequestSurface.js.map +1 -0
  24. package/lib/commonjs/ui/components/ProfileButton.js +4 -3
  25. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  26. package/lib/commonjs/ui/components/SettingsIcon.js +3 -2
  27. package/lib/commonjs/ui/components/SettingsIcon.js.map +1 -1
  28. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +527 -0
  29. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -0
  30. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js +90 -0
  31. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -0
  32. package/lib/commonjs/ui/components/authChooser/SignInRequestView.js +106 -0
  33. package/lib/commonjs/ui/components/authChooser/SignInRequestView.js.map +1 -0
  34. package/lib/commonjs/ui/components/authChooser/SignUpView.js +188 -0
  35. package/lib/commonjs/ui/components/authChooser/SignUpView.js.map +1 -0
  36. package/lib/commonjs/ui/components/authChooser/TroubleDisclosure.js +61 -0
  37. package/lib/commonjs/ui/components/authChooser/TroubleDisclosure.js.map +1 -0
  38. package/lib/commonjs/ui/components/authChooser/primitives.js +170 -0
  39. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -0
  40. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +153 -0
  41. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -0
  42. package/lib/commonjs/ui/components/authChooser/signInProgress.js +54 -0
  43. package/lib/commonjs/ui/components/authChooser/signInProgress.js.map +1 -0
  44. package/lib/commonjs/ui/components/{oxyAuthChooserStyles.js → authChooser/styles.js} +19 -1
  45. package/lib/commonjs/ui/components/authChooser/styles.js.map +1 -0
  46. package/lib/commonjs/ui/components/authChooser/types.js +70 -0
  47. package/lib/commonjs/ui/components/authChooser/types.js.map +1 -0
  48. package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js +50 -0
  49. package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js.map +1 -0
  50. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +3 -2
  51. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  52. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +3 -2
  53. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  54. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +15 -14
  55. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  56. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +6 -5
  57. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  58. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +3 -2
  59. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  60. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +6 -6
  61. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  62. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +5 -5
  63. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
  64. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +10 -9
  65. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  66. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +4 -3
  67. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  68. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +6 -5
  69. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  70. package/lib/commonjs/ui/context/OxyContext.js +200 -29
  71. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  72. package/lib/commonjs/ui/context/commitSessionFlow.js +43 -0
  73. package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
  74. package/lib/commonjs/ui/context/useOxyAccountGraph.js +13 -5
  75. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  76. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js +6 -1
  77. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js.map +1 -1
  78. package/lib/commonjs/ui/index.js +0 -13
  79. package/lib/commonjs/ui/index.js.map +1 -1
  80. package/lib/commonjs/ui/oauth/browserAuthTransport.js +168 -0
  81. package/lib/commonjs/ui/oauth/browserAuthTransport.js.map +1 -0
  82. package/lib/commonjs/ui/oauth/completeOAuthCode.js +78 -0
  83. package/lib/commonjs/ui/oauth/completeOAuthCode.js.map +1 -0
  84. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +48 -0
  85. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +1 -0
  86. package/lib/commonjs/ui/oauth/oauthHandshake.js +53 -0
  87. package/lib/commonjs/ui/oauth/oauthHandshake.js.map +1 -0
  88. package/lib/commonjs/ui/oauth/oauthPopup.js +229 -0
  89. package/lib/commonjs/ui/oauth/oauthPopup.js.map +1 -0
  90. package/lib/commonjs/ui/oauth/oauthPopupMessages.js +141 -0
  91. package/lib/commonjs/ui/oauth/oauthPopupMessages.js.map +1 -0
  92. package/lib/commonjs/ui/oauth/types.js +2 -0
  93. package/lib/commonjs/ui/oauth/types.js.map +1 -0
  94. package/lib/commonjs/ui/screens/AccountMembersScreen.js +4 -3
  95. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  96. package/lib/commonjs/ui/screens/CreateAccountScreen.js +7 -6
  97. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +4 -3
  99. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/FAQScreen.js +3 -2
  101. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/FeedbackScreen.js +11 -10
  103. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/FileManagementScreen.js +19 -18
  105. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  106. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +4 -3
  107. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  108. package/lib/commonjs/ui/screens/ManageAccountScreen.js +2 -2
  109. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  110. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +3 -3
  111. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  112. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +9 -8
  113. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  114. package/lib/commonjs/ui/screens/ProfileScreen.js +10 -10
  115. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  116. package/lib/commonjs/ui/screens/UserListScreen.js +3 -3
  117. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  118. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +3 -2
  119. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  120. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +4 -3
  121. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  122. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +4 -3
  123. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
  124. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +4 -3
  125. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  126. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +3 -2
  127. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
  128. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +3 -2
  129. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  130. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +4 -3
  131. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  132. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +4 -3
  133. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  134. package/lib/commonjs/ui/server.js +2 -5
  135. package/lib/commonjs/ui/server.js.map +1 -1
  136. package/lib/commonjs/ui/session/authStore.js +6 -75
  137. package/lib/commonjs/ui/session/authStore.js.map +1 -1
  138. package/lib/commonjs/ui/session/createSessionClient.js +11 -3
  139. package/lib/commonjs/ui/session/createSessionClient.js.map +1 -1
  140. package/lib/commonjs/ui/session/identityBinding.js +95 -0
  141. package/lib/commonjs/ui/session/identityBinding.js.map +1 -0
  142. package/lib/commonjs/ui/session/index.js +13 -0
  143. package/lib/commonjs/ui/session/index.js.map +1 -1
  144. package/lib/commonjs/ui/session/nativeSecureStorage.js +90 -0
  145. package/lib/commonjs/ui/session/nativeSecureStorage.js.map +1 -0
  146. package/lib/commonjs/ui/session/tokenTransport.js +11 -1
  147. package/lib/commonjs/ui/session/tokenTransport.js.map +1 -1
  148. package/lib/commonjs/ui/utils/crossOriginRestore.js +3 -2
  149. package/lib/commonjs/ui/utils/crossOriginRestore.js.map +1 -1
  150. package/lib/commonjs/ui/utils/deliveryPlatform.js +58 -0
  151. package/lib/commonjs/ui/utils/deliveryPlatform.js.map +1 -0
  152. package/lib/commonjs/ui/utils/oauthReturn.js +70 -46
  153. package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
  154. package/lib/module/index.js +27 -4
  155. package/lib/module/index.js.map +1 -1
  156. package/lib/module/notifications/deviceNotifications.js +371 -0
  157. package/lib/module/notifications/deviceNotifications.js.map +1 -0
  158. package/lib/module/ui/boot/runProviderColdBoot.js +51 -9
  159. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  160. package/lib/module/ui/client.js +0 -1
  161. package/lib/module/ui/client.js.map +1 -1
  162. package/lib/module/ui/components/AvatarCameraBadge.js +1 -1
  163. package/lib/module/ui/components/AvatarCameraBadge.js.map +1 -1
  164. package/lib/module/ui/components/OxyAccountDialogScreen.js +14 -3
  165. package/lib/module/ui/components/OxyAccountDialogScreen.js.map +1 -1
  166. package/lib/module/ui/components/OxyAuthChooser.js +74 -1126
  167. package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
  168. package/lib/module/ui/components/OxyConsentScreen.js +50 -12
  169. package/lib/module/ui/components/OxyConsentScreen.js.map +1 -1
  170. package/lib/module/ui/components/OxyProvider.js +4 -4
  171. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  172. package/lib/module/ui/components/OxySignInButton.js +76 -42
  173. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  174. package/lib/module/ui/components/OxySignInRequestSurface.js +141 -0
  175. package/lib/module/ui/components/OxySignInRequestSurface.js.map +1 -0
  176. package/lib/module/ui/components/ProfileButton.js +1 -1
  177. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  178. package/lib/module/ui/components/SettingsIcon.js +1 -1
  179. package/lib/module/ui/components/SettingsIcon.js.map +1 -1
  180. package/lib/module/ui/components/authChooser/AccountsMenuView.js +523 -0
  181. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -0
  182. package/lib/module/ui/components/authChooser/SignInEntryView.js +85 -0
  183. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -0
  184. package/lib/module/ui/components/authChooser/SignInRequestView.js +101 -0
  185. package/lib/module/ui/components/authChooser/SignInRequestView.js.map +1 -0
  186. package/lib/module/ui/components/authChooser/SignUpView.js +184 -0
  187. package/lib/module/ui/components/authChooser/SignUpView.js.map +1 -0
  188. package/lib/module/ui/components/authChooser/TroubleDisclosure.js +57 -0
  189. package/lib/module/ui/components/authChooser/TroubleDisclosure.js.map +1 -0
  190. package/lib/module/ui/components/authChooser/primitives.js +163 -0
  191. package/lib/module/ui/components/authChooser/primitives.js.map +1 -0
  192. package/lib/module/ui/components/authChooser/requestSurfaces.js +143 -0
  193. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -0
  194. package/lib/module/ui/components/authChooser/signInProgress.js +50 -0
  195. package/lib/module/ui/components/authChooser/signInProgress.js.map +1 -0
  196. package/lib/module/ui/components/{oxyAuthChooserStyles.js → authChooser/styles.js} +19 -1
  197. package/lib/module/ui/components/authChooser/styles.js.map +1 -0
  198. package/lib/module/ui/components/authChooser/types.js +66 -0
  199. package/lib/module/ui/components/authChooser/types.js.map +1 -0
  200. package/lib/module/ui/components/authChooser/useUsernameAvailability.js +46 -0
  201. package/lib/module/ui/components/authChooser/useUsernameAvailability.js.map +1 -0
  202. package/lib/module/ui/components/fileManagement/AnimatedButton.js +1 -1
  203. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  204. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +1 -1
  205. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  206. package/lib/module/ui/components/fileManagement/FileViewer.js +1 -1
  207. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  208. package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
  209. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  210. package/lib/module/ui/components/modals/DeleteAccountModal.js +1 -1
  211. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  212. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  213. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  214. package/lib/module/ui/components/payment/PaymentMethodStep.js +1 -1
  215. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
  216. package/lib/module/ui/components/payment/PaymentReviewStep.js +1 -1
  217. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  218. package/lib/module/ui/components/payment/PaymentSuccessStep.js +1 -1
  219. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  220. package/lib/module/ui/components/payment/PaymentSummaryStep.js +1 -1
  221. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  222. package/lib/module/ui/context/OxyContext.js +203 -32
  223. package/lib/module/ui/context/OxyContext.js.map +1 -1
  224. package/lib/module/ui/context/commitSessionFlow.js +42 -0
  225. package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
  226. package/lib/module/ui/context/useOxyAccountGraph.js +13 -5
  227. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  228. package/lib/module/ui/hooks/useSwitchableAccounts.js +6 -1
  229. package/lib/module/ui/hooks/useSwitchableAccounts.js.map +1 -1
  230. package/lib/module/ui/index.js +0 -1
  231. package/lib/module/ui/index.js.map +1 -1
  232. package/lib/module/ui/oauth/browserAuthTransport.js +165 -0
  233. package/lib/module/ui/oauth/browserAuthTransport.js.map +1 -0
  234. package/lib/module/ui/oauth/completeOAuthCode.js +75 -0
  235. package/lib/module/ui/oauth/completeOAuthCode.js.map +1 -0
  236. package/lib/module/ui/oauth/legacyRedirectLanes.js +44 -0
  237. package/lib/module/ui/oauth/legacyRedirectLanes.js.map +1 -0
  238. package/lib/module/ui/oauth/oauthHandshake.js +50 -0
  239. package/lib/module/ui/oauth/oauthHandshake.js.map +1 -0
  240. package/lib/module/ui/oauth/oauthPopup.js +221 -0
  241. package/lib/module/ui/oauth/oauthPopup.js.map +1 -0
  242. package/lib/module/ui/oauth/oauthPopupMessages.js +135 -0
  243. package/lib/module/ui/oauth/oauthPopupMessages.js.map +1 -0
  244. package/lib/module/ui/oauth/types.js +2 -0
  245. package/lib/module/ui/oauth/types.js.map +1 -0
  246. package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
  247. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  248. package/lib/module/ui/screens/CreateAccountScreen.js +1 -1
  249. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  250. package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
  251. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  252. package/lib/module/ui/screens/FAQScreen.js +1 -1
  253. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  254. package/lib/module/ui/screens/FeedbackScreen.js +1 -1
  255. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  256. package/lib/module/ui/screens/FileManagementScreen.js +2 -1
  257. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  258. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  259. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  260. package/lib/module/ui/screens/ManageAccountScreen.js +1 -1
  261. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  262. package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
  263. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  264. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +1 -1
  265. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  266. package/lib/module/ui/screens/ProfileScreen.js +1 -1
  267. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  268. package/lib/module/ui/screens/UserListScreen.js +1 -1
  269. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  270. package/lib/module/ui/screens/WelcomeNewUserScreen.js +1 -1
  271. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  272. package/lib/module/ui/screens/fileManagement/FileLibraryError.js +1 -1
  273. package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  274. package/lib/module/ui/screens/fileManagement/FileListSection.js +1 -1
  275. package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
  276. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +2 -1
  277. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  278. package/lib/module/ui/screens/fileManagement/UploadBar.js +1 -1
  279. package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
  280. package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
  281. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  282. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +1 -1
  283. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  284. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
  285. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  286. package/lib/module/ui/server.js +0 -2
  287. package/lib/module/ui/server.js.map +1 -1
  288. package/lib/module/ui/session/authStore.js +5 -75
  289. package/lib/module/ui/session/authStore.js.map +1 -1
  290. package/lib/module/ui/session/createSessionClient.js +11 -3
  291. package/lib/module/ui/session/createSessionClient.js.map +1 -1
  292. package/lib/module/ui/session/identityBinding.js +89 -0
  293. package/lib/module/ui/session/identityBinding.js.map +1 -0
  294. package/lib/module/ui/session/index.js +5 -2
  295. package/lib/module/ui/session/index.js.map +1 -1
  296. package/lib/module/ui/session/nativeSecureStorage.js +88 -0
  297. package/lib/module/ui/session/nativeSecureStorage.js.map +1 -0
  298. package/lib/module/ui/session/tokenTransport.js +11 -1
  299. package/lib/module/ui/session/tokenTransport.js.map +1 -1
  300. package/lib/module/ui/utils/crossOriginRestore.js +4 -3
  301. package/lib/module/ui/utils/crossOriginRestore.js.map +1 -1
  302. package/lib/module/ui/utils/deliveryPlatform.js +55 -0
  303. package/lib/module/ui/utils/deliveryPlatform.js.map +1 -0
  304. package/lib/module/ui/utils/oauthReturn.js +70 -46
  305. package/lib/module/ui/utils/oauthReturn.js.map +1 -1
  306. package/lib/typescript/commonjs/index.d.ts +9 -1
  307. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  308. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts +141 -0
  309. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts.map +1 -0
  310. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +34 -2
  311. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/ui/client.d.ts +0 -1
  313. package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  315. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts +16 -29
  316. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
  317. package/lib/typescript/commonjs/ui/components/OxyConsentScreen.d.ts.map +1 -1
  318. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  319. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +17 -12
  320. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  321. package/lib/typescript/commonjs/ui/components/OxySignInRequestSurface.d.ts +108 -0
  322. package/lib/typescript/commonjs/ui/components/OxySignInRequestSurface.d.ts.map +1 -0
  323. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts +1 -1
  324. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts.map +1 -1
  325. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts +38 -0
  326. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -0
  327. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts +32 -0
  328. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts.map +1 -0
  329. package/lib/typescript/commonjs/ui/components/authChooser/SignInRequestView.d.ts +34 -0
  330. package/lib/typescript/commonjs/ui/components/authChooser/SignInRequestView.d.ts.map +1 -0
  331. package/lib/typescript/commonjs/ui/components/authChooser/SignUpView.d.ts +34 -0
  332. package/lib/typescript/commonjs/ui/components/authChooser/SignUpView.d.ts.map +1 -0
  333. package/lib/typescript/commonjs/ui/components/authChooser/TroubleDisclosure.d.ts +36 -0
  334. package/lib/typescript/commonjs/ui/components/authChooser/TroubleDisclosure.d.ts.map +1 -0
  335. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts +55 -0
  336. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts.map +1 -0
  337. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts +58 -0
  338. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts.map +1 -0
  339. package/lib/typescript/commonjs/ui/components/authChooser/signInProgress.d.ts +26 -0
  340. package/lib/typescript/commonjs/ui/components/authChooser/signInProgress.d.ts.map +1 -0
  341. package/lib/typescript/{module/ui/components/oxyAuthChooserStyles.d.ts → commonjs/ui/components/authChooser/styles.d.ts} +19 -1
  342. package/lib/typescript/commonjs/ui/components/authChooser/styles.d.ts.map +1 -0
  343. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts +103 -0
  344. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts.map +1 -0
  345. package/lib/typescript/commonjs/ui/components/authChooser/useUsernameAvailability.d.ts +16 -0
  346. package/lib/typescript/commonjs/ui/components/authChooser/useUsernameAvailability.d.ts.map +1 -0
  347. package/lib/typescript/commonjs/ui/components/payment/types.d.ts +1 -1
  348. package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  350. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +40 -0
  351. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
  352. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +44 -1
  353. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  354. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +7 -1
  355. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  356. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts.map +1 -1
  357. package/lib/typescript/commonjs/ui/index.d.ts +0 -1
  358. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  359. package/lib/typescript/commonjs/ui/oauth/browserAuthTransport.d.ts +56 -0
  360. package/lib/typescript/commonjs/ui/oauth/browserAuthTransport.d.ts.map +1 -0
  361. package/lib/typescript/commonjs/ui/oauth/completeOAuthCode.d.ts +49 -0
  362. package/lib/typescript/commonjs/ui/oauth/completeOAuthCode.d.ts.map +1 -0
  363. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +40 -0
  364. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
  365. package/lib/typescript/commonjs/ui/oauth/oauthHandshake.d.ts +50 -0
  366. package/lib/typescript/commonjs/ui/oauth/oauthHandshake.d.ts.map +1 -0
  367. package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts +77 -0
  368. package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts.map +1 -0
  369. package/lib/typescript/commonjs/ui/oauth/oauthPopupMessages.d.ts +67 -0
  370. package/lib/typescript/commonjs/ui/oauth/oauthPopupMessages.d.ts.map +1 -0
  371. package/lib/typescript/commonjs/ui/oauth/types.d.ts +176 -0
  372. package/lib/typescript/commonjs/ui/oauth/types.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  374. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  375. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  376. package/lib/typescript/commonjs/ui/server.d.ts +0 -2
  377. package/lib/typescript/commonjs/ui/server.d.ts.map +1 -1
  378. package/lib/typescript/commonjs/ui/session/authStore.d.ts +3 -7
  379. package/lib/typescript/commonjs/ui/session/authStore.d.ts.map +1 -1
  380. package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts +8 -1
  381. package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts.map +1 -1
  382. package/lib/typescript/commonjs/ui/session/identityBinding.d.ts +66 -0
  383. package/lib/typescript/commonjs/ui/session/identityBinding.d.ts.map +1 -0
  384. package/lib/typescript/commonjs/ui/session/index.d.ts +6 -2
  385. package/lib/typescript/commonjs/ui/session/index.d.ts.map +1 -1
  386. package/lib/typescript/commonjs/ui/session/nativeSecureStorage.d.ts +25 -0
  387. package/lib/typescript/commonjs/ui/session/nativeSecureStorage.d.ts.map +1 -0
  388. package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts +8 -1
  389. package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts.map +1 -1
  390. package/lib/typescript/commonjs/ui/types/navigation.d.ts +44 -0
  391. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  392. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +1 -1
  393. package/lib/typescript/commonjs/ui/utils/deliveryPlatform.d.ts +33 -0
  394. package/lib/typescript/commonjs/ui/utils/deliveryPlatform.d.ts.map +1 -0
  395. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +1 -1
  396. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  397. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +30 -16
  398. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
  399. package/lib/typescript/module/index.d.ts +9 -1
  400. package/lib/typescript/module/index.d.ts.map +1 -1
  401. package/lib/typescript/module/notifications/deviceNotifications.d.ts +141 -0
  402. package/lib/typescript/module/notifications/deviceNotifications.d.ts.map +1 -0
  403. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +34 -2
  404. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  405. package/lib/typescript/module/ui/client.d.ts +0 -1
  406. package/lib/typescript/module/ui/client.d.ts.map +1 -1
  407. package/lib/typescript/module/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  408. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts +16 -29
  409. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
  410. package/lib/typescript/module/ui/components/OxyConsentScreen.d.ts.map +1 -1
  411. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  412. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +17 -12
  413. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  414. package/lib/typescript/module/ui/components/OxySignInRequestSurface.d.ts +108 -0
  415. package/lib/typescript/module/ui/components/OxySignInRequestSurface.d.ts.map +1 -0
  416. package/lib/typescript/module/ui/components/SettingsIcon.d.ts +1 -1
  417. package/lib/typescript/module/ui/components/SettingsIcon.d.ts.map +1 -1
  418. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts +38 -0
  419. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -0
  420. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts +32 -0
  421. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts.map +1 -0
  422. package/lib/typescript/module/ui/components/authChooser/SignInRequestView.d.ts +34 -0
  423. package/lib/typescript/module/ui/components/authChooser/SignInRequestView.d.ts.map +1 -0
  424. package/lib/typescript/module/ui/components/authChooser/SignUpView.d.ts +34 -0
  425. package/lib/typescript/module/ui/components/authChooser/SignUpView.d.ts.map +1 -0
  426. package/lib/typescript/module/ui/components/authChooser/TroubleDisclosure.d.ts +36 -0
  427. package/lib/typescript/module/ui/components/authChooser/TroubleDisclosure.d.ts.map +1 -0
  428. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts +55 -0
  429. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts.map +1 -0
  430. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts +58 -0
  431. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts.map +1 -0
  432. package/lib/typescript/module/ui/components/authChooser/signInProgress.d.ts +26 -0
  433. package/lib/typescript/module/ui/components/authChooser/signInProgress.d.ts.map +1 -0
  434. package/lib/typescript/{commonjs/ui/components/oxyAuthChooserStyles.d.ts → module/ui/components/authChooser/styles.d.ts} +19 -1
  435. package/lib/typescript/module/ui/components/authChooser/styles.d.ts.map +1 -0
  436. package/lib/typescript/module/ui/components/authChooser/types.d.ts +103 -0
  437. package/lib/typescript/module/ui/components/authChooser/types.d.ts.map +1 -0
  438. package/lib/typescript/module/ui/components/authChooser/useUsernameAvailability.d.ts +16 -0
  439. package/lib/typescript/module/ui/components/authChooser/useUsernameAvailability.d.ts.map +1 -0
  440. package/lib/typescript/module/ui/components/payment/types.d.ts +1 -1
  441. package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
  442. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  443. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +40 -0
  444. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
  445. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +44 -1
  446. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  447. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +7 -1
  448. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  449. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts.map +1 -1
  450. package/lib/typescript/module/ui/index.d.ts +0 -1
  451. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  452. package/lib/typescript/module/ui/oauth/browserAuthTransport.d.ts +56 -0
  453. package/lib/typescript/module/ui/oauth/browserAuthTransport.d.ts.map +1 -0
  454. package/lib/typescript/module/ui/oauth/completeOAuthCode.d.ts +49 -0
  455. package/lib/typescript/module/ui/oauth/completeOAuthCode.d.ts.map +1 -0
  456. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +40 -0
  457. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
  458. package/lib/typescript/module/ui/oauth/oauthHandshake.d.ts +50 -0
  459. package/lib/typescript/module/ui/oauth/oauthHandshake.d.ts.map +1 -0
  460. package/lib/typescript/module/ui/oauth/oauthPopup.d.ts +77 -0
  461. package/lib/typescript/module/ui/oauth/oauthPopup.d.ts.map +1 -0
  462. package/lib/typescript/module/ui/oauth/oauthPopupMessages.d.ts +67 -0
  463. package/lib/typescript/module/ui/oauth/oauthPopupMessages.d.ts.map +1 -0
  464. package/lib/typescript/module/ui/oauth/types.d.ts +176 -0
  465. package/lib/typescript/module/ui/oauth/types.d.ts.map +1 -0
  466. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  467. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  468. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  469. package/lib/typescript/module/ui/server.d.ts +0 -2
  470. package/lib/typescript/module/ui/server.d.ts.map +1 -1
  471. package/lib/typescript/module/ui/session/authStore.d.ts +3 -7
  472. package/lib/typescript/module/ui/session/authStore.d.ts.map +1 -1
  473. package/lib/typescript/module/ui/session/createSessionClient.d.ts +8 -1
  474. package/lib/typescript/module/ui/session/createSessionClient.d.ts.map +1 -1
  475. package/lib/typescript/module/ui/session/identityBinding.d.ts +66 -0
  476. package/lib/typescript/module/ui/session/identityBinding.d.ts.map +1 -0
  477. package/lib/typescript/module/ui/session/index.d.ts +6 -2
  478. package/lib/typescript/module/ui/session/index.d.ts.map +1 -1
  479. package/lib/typescript/module/ui/session/nativeSecureStorage.d.ts +25 -0
  480. package/lib/typescript/module/ui/session/nativeSecureStorage.d.ts.map +1 -0
  481. package/lib/typescript/module/ui/session/tokenTransport.d.ts +8 -1
  482. package/lib/typescript/module/ui/session/tokenTransport.d.ts.map +1 -1
  483. package/lib/typescript/module/ui/types/navigation.d.ts +44 -0
  484. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  485. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +1 -1
  486. package/lib/typescript/module/ui/utils/deliveryPlatform.d.ts +33 -0
  487. package/lib/typescript/module/ui/utils/deliveryPlatform.d.ts.map +1 -0
  488. package/lib/typescript/module/ui/utils/fileManagement.d.ts +1 -1
  489. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  490. package/lib/typescript/module/ui/utils/oauthReturn.d.ts +30 -16
  491. package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
  492. package/package.json +15 -7
  493. package/src/index.ts +50 -5
  494. package/src/notifications/deviceNotifications.ts +395 -0
  495. package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +281 -0
  496. package/src/ui/boot/runProviderColdBoot.ts +83 -13
  497. package/src/ui/client.ts +0 -1
  498. package/src/ui/components/AvatarCameraBadge.tsx +1 -1
  499. package/src/ui/components/OxyAccountDialogScreen.tsx +20 -3
  500. package/src/ui/components/OxyAuthChooser.tsx +91 -1230
  501. package/src/ui/components/OxyConsentScreen.tsx +56 -13
  502. package/src/ui/components/OxyProvider.tsx +4 -4
  503. package/src/ui/components/OxySignInButton.tsx +119 -78
  504. package/src/ui/components/OxySignInRequestSurface.tsx +202 -0
  505. package/src/ui/components/ProfileButton.tsx +1 -1
  506. package/src/ui/components/SettingsIcon.tsx +1 -1
  507. package/src/ui/components/__tests__/OxyConsentScreen.test.tsx +27 -0
  508. package/src/ui/components/authChooser/AccountsMenuView.tsx +569 -0
  509. package/src/ui/components/authChooser/SignInEntryView.tsx +121 -0
  510. package/src/ui/components/authChooser/SignInRequestView.tsx +130 -0
  511. package/src/ui/components/authChooser/SignUpView.tsx +174 -0
  512. package/src/ui/components/authChooser/TroubleDisclosure.tsx +73 -0
  513. package/src/ui/components/authChooser/primitives.tsx +144 -0
  514. package/src/ui/components/authChooser/requestSurfaces.tsx +120 -0
  515. package/src/ui/components/authChooser/signInProgress.ts +54 -0
  516. package/src/ui/components/{oxyAuthChooserStyles.ts → authChooser/styles.ts} +18 -0
  517. package/src/ui/components/authChooser/types.ts +120 -0
  518. package/src/ui/components/authChooser/useUsernameAvailability.ts +60 -0
  519. package/src/ui/components/fileManagement/AnimatedButton.tsx +1 -1
  520. package/src/ui/components/fileManagement/FileDetailsModal.tsx +1 -1
  521. package/src/ui/components/fileManagement/FileViewer.tsx +1 -1
  522. package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
  523. package/src/ui/components/modals/DeleteAccountModal.tsx +1 -1
  524. package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
  525. package/src/ui/components/payment/PaymentMethodStep.tsx +1 -1
  526. package/src/ui/components/payment/PaymentReviewStep.tsx +1 -1
  527. package/src/ui/components/payment/PaymentSuccessStep.tsx +1 -1
  528. package/src/ui/components/payment/PaymentSummaryStep.tsx +1 -1
  529. package/src/ui/components/payment/types.ts +1 -1
  530. package/src/ui/context/OxyContext.tsx +220 -24
  531. package/src/ui/context/__tests__/commitSessionFlow.test.ts +89 -0
  532. package/src/ui/context/commitSessionFlow.ts +61 -0
  533. package/src/ui/context/oxyContextTypes.ts +45 -1
  534. package/src/ui/context/useOxyAccountGraph.ts +19 -5
  535. package/src/ui/hooks/useSwitchableAccounts.ts +12 -1
  536. package/src/ui/index.ts +0 -1
  537. package/src/ui/oauth/__tests__/browserAuthTransport.test.ts +335 -0
  538. package/src/ui/oauth/__tests__/completeOAuthCode.test.ts +142 -0
  539. package/src/ui/oauth/__tests__/oauthPopup.test.ts +326 -0
  540. package/src/ui/oauth/__tests__/oauthPopupMessages.test.ts +189 -0
  541. package/src/ui/oauth/__tests__/sharedCompletionPath.test.ts +174 -0
  542. package/src/ui/oauth/browserAuthTransport.ts +187 -0
  543. package/src/ui/oauth/completeOAuthCode.ts +93 -0
  544. package/src/ui/oauth/legacyRedirectLanes.ts +43 -0
  545. package/src/ui/oauth/oauthHandshake.ts +74 -0
  546. package/src/ui/oauth/oauthPopup.ts +219 -0
  547. package/src/ui/oauth/oauthPopupMessages.ts +136 -0
  548. package/src/ui/oauth/types.ts +150 -0
  549. package/src/ui/screens/AccountMembersScreen.tsx +1 -1
  550. package/src/ui/screens/CreateAccountScreen.tsx +1 -1
  551. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  552. package/src/ui/screens/FAQScreen.tsx +1 -1
  553. package/src/ui/screens/FeedbackScreen.tsx +2 -1
  554. package/src/ui/screens/FileManagementScreen.tsx +2 -1
  555. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  556. package/src/ui/screens/ManageAccountScreen.tsx +1 -1
  557. package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
  558. package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
  559. package/src/ui/screens/ProfileScreen.tsx +1 -1
  560. package/src/ui/screens/UserListScreen.tsx +1 -1
  561. package/src/ui/screens/WelcomeNewUserScreen.tsx +1 -1
  562. package/src/ui/screens/fileManagement/FileLibraryError.tsx +1 -1
  563. package/src/ui/screens/fileManagement/FileListSection.tsx +1 -1
  564. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +2 -1
  565. package/src/ui/screens/fileManagement/UploadBar.tsx +1 -1
  566. package/src/ui/screens/trust/TrustCenterScreen.tsx +1 -1
  567. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +1 -1
  568. package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
  569. package/src/ui/server.ts +0 -2
  570. package/src/ui/session/__tests__/createSessionClient.test.ts +26 -0
  571. package/src/ui/session/__tests__/tokenTransport.test.ts +34 -0
  572. package/src/ui/session/authStore.ts +5 -89
  573. package/src/ui/session/createSessionClient.ts +15 -2
  574. package/src/ui/session/identityBinding.ts +116 -0
  575. package/src/ui/session/index.ts +6 -2
  576. package/src/ui/session/nativeSecureStorage.ts +98 -0
  577. package/src/ui/session/tokenTransport.ts +14 -1
  578. package/src/ui/types/navigation.ts +44 -1
  579. package/src/ui/utils/crossOriginRestore.ts +4 -7
  580. package/src/ui/utils/deliveryPlatform.ts +65 -0
  581. package/src/ui/utils/fileManagement.ts +1 -1
  582. package/src/ui/utils/oauthReturn.ts +74 -65
  583. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  584. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  585. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  586. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  587. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  588. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  589. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  590. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  591. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  592. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  593. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  594. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  595. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  596. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  597. package/lib/commonjs/ui/components/FontLoader.js +0 -35
  598. package/lib/commonjs/ui/components/FontLoader.js.map +0 -1
  599. package/lib/commonjs/ui/components/FontLoader.native.js +0 -88
  600. package/lib/commonjs/ui/components/FontLoader.native.js.map +0 -1
  601. package/lib/commonjs/ui/components/oxyAuthChooserStyles.js.map +0 -1
  602. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  603. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  604. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  605. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  606. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  607. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  608. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  609. package/lib/module/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  610. package/lib/module/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  611. package/lib/module/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  612. package/lib/module/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  613. package/lib/module/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  614. package/lib/module/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  615. package/lib/module/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  616. package/lib/module/ui/components/FontLoader.js +0 -29
  617. package/lib/module/ui/components/FontLoader.js.map +0 -1
  618. package/lib/module/ui/components/FontLoader.native.js +0 -83
  619. package/lib/module/ui/components/FontLoader.native.js.map +0 -1
  620. package/lib/module/ui/components/oxyAuthChooserStyles.js.map +0 -1
  621. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +0 -24
  622. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +0 -1
  623. package/lib/typescript/commonjs/ui/components/FontLoader.native.d.ts +0 -13
  624. package/lib/typescript/commonjs/ui/components/FontLoader.native.d.ts.map +0 -1
  625. package/lib/typescript/commonjs/ui/components/oxyAuthChooserStyles.d.ts.map +0 -1
  626. package/lib/typescript/module/ui/components/FontLoader.d.ts +0 -24
  627. package/lib/typescript/module/ui/components/FontLoader.d.ts.map +0 -1
  628. package/lib/typescript/module/ui/components/FontLoader.native.d.ts +0 -13
  629. package/lib/typescript/module/ui/components/FontLoader.native.d.ts.map +0 -1
  630. package/lib/typescript/module/ui/components/oxyAuthChooserStyles.d.ts.map +0 -1
  631. package/src/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  632. package/src/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  633. package/src/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  634. package/src/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  635. package/src/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  636. package/src/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  637. package/src/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  638. package/src/ui/components/FontLoader.native.tsx +0 -88
  639. package/src/ui/components/FontLoader.tsx +0 -27
@@ -0,0 +1,395 @@
1
+ /**
2
+ * The ONE place `@oxyhq/services` touches `expo-notifications`.
3
+ *
4
+ * Every Oxy app that receives push needs the identical adapter — native-only,
5
+ * dynamically imported, reading the OS permission and minting an EXPO push
6
+ * token — so it lives here instead of being copied into each app. The
7
+ * bearer-authenticated transport (`registerPushToken` / `unregisterPushToken`)
8
+ * already lives in `@oxyhq/core`; core may never import an `expo-*` module, and
9
+ * this adapter is the Expo-side half that closes that gap.
10
+ *
11
+ * ## Native-only by construction
12
+ *
13
+ * Every entry point resolves its null/no-op result from `Platform.OS` BEFORE the
14
+ * dynamic `import()`, so a web bundle never requests `expo-notifications` at all.
15
+ * `expo-notifications` and `expo-constants` are OPTIONAL peer dependencies: an
16
+ * app that does not use push never installs them, and a build without them
17
+ * degrades to "notifications unavailable" rather than throwing at
18
+ * module-evaluation time.
19
+ *
20
+ * ## The token is an EXPO push token — never a raw device token
21
+ *
22
+ * {@link getExpoPushToken} calls `getExpoPushTokenAsync()`, which returns the
23
+ * `ExponentPushToken[…]` handle Expo's push service delivers through — the only
24
+ * form it accepts. `getDevicePushTokenAsync()` — the raw APNs/FCM token — is
25
+ * deliberately NOT used anywhere: registering one of those looks entirely
26
+ * successful (the row is stored, the endpoint returns 200) and then every push
27
+ * silently fails at delivery time. `@oxyhq/core`'s `registerPushToken` rejects a
28
+ * raw device token before sending, and this module is the reason it never has to.
29
+ *
30
+ * ## The payload is untrusted
31
+ *
32
+ * Nothing here surfaces a notification's `title` / `body` / `subtitle`. The only
33
+ * payload that leaves this module is the raw `content.data` — the routing keys —
34
+ * typed `unknown`, so a caller has to validate it before acting on it and there
35
+ * is no exported shape that invites rendering push-delivered text. The
36
+ * foreground handler likewise answers with a visibility verdict and nothing else.
37
+ */
38
+
39
+ import { createLogger } from '@oxyhq/core';
40
+ import type { PushTokenPlatform } from '@oxyhq/core';
41
+ import { Platform } from 'react-native';
42
+
43
+ const log = createLogger('deviceNotifications');
44
+
45
+ type NotificationsModule = typeof import('expo-notifications');
46
+ type ConstantsModule = typeof import('expo-constants');
47
+
48
+ function isRecord(value: unknown): value is Record<string, unknown> {
49
+ return typeof value === 'object' && value !== null;
50
+ }
51
+
52
+ /**
53
+ * Load `expo-notifications`, or `null` when it cannot serve this platform/build.
54
+ *
55
+ * The web guard runs before the `import()`, so a web bundle never reaches for the
56
+ * native module. The dynamic import is intentional: the module registry caches
57
+ * it, so repeated calls are cheap and no module-level mutable cache is
58
+ * introduced here.
59
+ */
60
+ async function loadNotifications(): Promise<NotificationsModule | null> {
61
+ if (Platform.OS === 'web') {
62
+ return null;
63
+ }
64
+ try {
65
+ return await import('expo-notifications');
66
+ } catch (error) {
67
+ log.warn(
68
+ 'expo-notifications is unavailable in this build — push is disabled',
69
+ { method: 'loadNotifications' },
70
+ error,
71
+ );
72
+ return null;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * The EAS project id an Expo push token is minted against, or `null` when the
78
+ * app config carries none.
79
+ *
80
+ * Resolved exactly the way `expo-notifications` resolves it internally
81
+ * (`easConfig.projectId`, then `expoConfig.extra.eas.projectId`) and then handed
82
+ * BACK to `getExpoPushTokenAsync` explicitly, so the two can never disagree.
83
+ * Reading it here is what turns "no project id" from an opaque
84
+ * `ERR_NOTIFICATIONS_NO_EXPERIENCE_ID` rejection into a named, actionable state
85
+ * instead of one more entry in the indistinguishable "permission denied /
86
+ * offline" bucket.
87
+ *
88
+ * A missing `expo-constants` lands on the same `null` outcome — the single
89
+ * actionable warning is emitted once by the caller, so this path only records
90
+ * the extra detail at debug level rather than warning twice for one condition.
91
+ */
92
+ async function easProjectId(): Promise<string | null> {
93
+ let constants: ConstantsModule['default'];
94
+ try {
95
+ constants = (await import('expo-constants')).default;
96
+ } catch (error) {
97
+ log.debug(
98
+ 'expo-constants is unavailable in this build — no EAS project id can be resolved',
99
+ { method: 'easProjectId' },
100
+ error,
101
+ );
102
+ return null;
103
+ }
104
+
105
+ const fromEasConfig = constants.easConfig?.projectId;
106
+ if (typeof fromEasConfig === 'string' && fromEasConfig.length > 0) {
107
+ return fromEasConfig;
108
+ }
109
+
110
+ const extra: unknown = constants.expoConfig?.extra;
111
+ const eas = isRecord(extra) ? extra.eas : undefined;
112
+ const projectId = isRecord(eas) ? eas.projectId : undefined;
113
+ return typeof projectId === 'string' && projectId.length > 0 ? projectId : null;
114
+ }
115
+
116
+ /**
117
+ * The platform tag the push-token registry stores this installation under, or
118
+ * `null` on a platform Oxy does not deliver push to.
119
+ *
120
+ * Synchronous and import-free — the answer is a property of the bundle, not of
121
+ * any native module.
122
+ *
123
+ * Web is `null` on purpose: the registry accepts a `web` platform, but browser
124
+ * push needs a VAPID key + service-worker subscription no Oxy app has wired, so
125
+ * there is no token to register and claiming otherwise would store a row nothing
126
+ * can ever deliver to.
127
+ */
128
+ export function pushTokenPlatform(): PushTokenPlatform | null {
129
+ return Platform.OS === 'ios' || Platform.OS === 'android' ? Platform.OS : null;
130
+ }
131
+
132
+ /**
133
+ * Whether the OS notification permission is ALREADY granted.
134
+ *
135
+ * Never prompts, so an app can re-check on every cold boot without ever asking
136
+ * the user twice. Use {@link requestNotificationPermission} for the one place
137
+ * that is allowed to show the system dialog.
138
+ */
139
+ export async function hasNotificationPermission(): Promise<boolean> {
140
+ const notifications = await loadNotifications();
141
+ if (!notifications) {
142
+ return false;
143
+ }
144
+ try {
145
+ const permissions = await notifications.getPermissionsAsync();
146
+ return permissions.granted === true;
147
+ } catch (error) {
148
+ log.warn(
149
+ 'could not read the notification permission',
150
+ { method: 'hasNotificationPermission' },
151
+ error,
152
+ );
153
+ return false;
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Ensure the OS notification permission, prompting at most once.
159
+ *
160
+ * An installation that already answered the system dialog is never asked again:
161
+ * an already-granted permission resolves `true` without a second dialog, and a
162
+ * denial with `canAskAgain: false` resolves `false` without issuing a request
163
+ * the OS would silently ignore.
164
+ *
165
+ * @returns Whether notifications are granted once this call is done.
166
+ */
167
+ export async function requestNotificationPermission(): Promise<boolean> {
168
+ const notifications = await loadNotifications();
169
+ if (!notifications) {
170
+ return false;
171
+ }
172
+ try {
173
+ const existing = await notifications.getPermissionsAsync();
174
+ if (existing.granted === true) {
175
+ return true;
176
+ }
177
+ if (existing.canAskAgain === false) {
178
+ return false;
179
+ }
180
+ const requested = await notifications.requestPermissionsAsync();
181
+ return requested.granted === true;
182
+ } catch (error) {
183
+ log.warn(
184
+ 'the notification permission could not be resolved',
185
+ { method: 'requestNotificationPermission' },
186
+ error,
187
+ );
188
+ return false;
189
+ }
190
+ }
191
+
192
+ /**
193
+ * This installation's Expo push token (`ExponentPushToken[…]`), or `null` when
194
+ * one cannot be minted.
195
+ *
196
+ * Deliberately `getExpoPushTokenAsync` — see the module header for why the raw
197
+ * device-token variant is never used.
198
+ *
199
+ * Every `null` is logged with the reason it happened. A missing EAS project id
200
+ * in particular is a BUILD MISCONFIGURATION, not a user state: no token can ever
201
+ * be minted, so push is off for every install of that build until the config is
202
+ * fixed. It is reported as such rather than blending into the
203
+ * indistinguishable "permission denied / offline" bucket.
204
+ */
205
+ export async function getExpoPushToken(): Promise<string | null> {
206
+ const notifications = await loadNotifications();
207
+ if (!notifications) {
208
+ return null;
209
+ }
210
+
211
+ const projectId = await easProjectId();
212
+ if (!projectId) {
213
+ log.warn(
214
+ 'no EAS project id in the app config (expo.extra.eas.projectId) — an Expo push token cannot be minted, so push is disabled for this build',
215
+ { method: 'getExpoPushToken' },
216
+ );
217
+ return null;
218
+ }
219
+
220
+ try {
221
+ const token = await notifications.getExpoPushTokenAsync({ projectId });
222
+ if (token.data.length === 0) {
223
+ log.warn('the Expo push service returned an empty token', { method: 'getExpoPushToken' });
224
+ return null;
225
+ }
226
+ return token.data;
227
+ } catch (error) {
228
+ log.warn('could not mint an Expo push token', { method: 'getExpoPushToken' }, error);
229
+ return null;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Take the payload of the notification that COLD-LAUNCHED the app, if any.
235
+ *
236
+ * "Take" is literal: the response is cleared from `expo-notifications` once
237
+ * read, so a listener attached later in the same launch is not handed the same
238
+ * tap again. Clearing is best-effort across OS/module versions, so a caller that
239
+ * must not act twice still needs its own idempotency ledger.
240
+ *
241
+ * @returns The raw, untrusted `content.data` of the launching notification, or
242
+ * `null`. Parsing/validation is the caller's job.
243
+ */
244
+ export async function takeLaunchNotificationData(): Promise<unknown> {
245
+ const notifications = await loadNotifications();
246
+ if (!notifications) {
247
+ return null;
248
+ }
249
+ try {
250
+ const response = notifications.getLastNotificationResponse();
251
+ if (!response) {
252
+ return null;
253
+ }
254
+ const data: unknown = response.notification.request.content.data;
255
+ try {
256
+ notifications.clearLastNotificationResponse();
257
+ } catch (clearError) {
258
+ log.warn(
259
+ 'could not clear the launching notification response',
260
+ { method: 'takeLaunchNotificationData' },
261
+ clearError,
262
+ );
263
+ }
264
+ return data;
265
+ } catch (error) {
266
+ log.warn(
267
+ 'could not read the launching notification',
268
+ { method: 'takeLaunchNotificationData' },
269
+ error,
270
+ );
271
+ return null;
272
+ }
273
+ }
274
+
275
+ /**
276
+ * What the OS should do with a notification that arrives while the app is
277
+ * FOREGROUNDED.
278
+ *
279
+ * `'suppress'` is `expo-notifications`' own default for a foregrounded app, so a
280
+ * decision function that only ever returns `'show'` for the payloads it
281
+ * recognises leaves every other notification exactly as it behaves today.
282
+ */
283
+ export type ForegroundPresentation = 'show' | 'suppress';
284
+
285
+ /**
286
+ * Whether the process-wide foreground handler has already been ATTEMPTED.
287
+ *
288
+ * `setNotificationHandler` is global, last-writer-wins process state, so this is
289
+ * a one-shot install rather than something a mount/unmount cycle owns. A failed
290
+ * attempt is deliberately not retried: the only failure modes are permanent for
291
+ * the life of the process (web, a build without the native module, a native
292
+ * module that threw on registration).
293
+ *
294
+ * Module-scoped and only ever touched from an async install call — never read
295
+ * during render, so the React Compiler has no memoizable position to freeze it
296
+ * into.
297
+ */
298
+ let foregroundHandlerAttempted = false;
299
+
300
+ /**
301
+ * Install the ONE process-wide handler that decides whether an incoming
302
+ * notification is shown while the app is in the FOREGROUND.
303
+ *
304
+ * Without a handler, `expo-notifications` shows nothing at all while the app is
305
+ * open — which is exactly when a time-critical notification (a "Sign in with
306
+ * Oxy" approval request, say) matters most, because the user is already holding
307
+ * the phone.
308
+ *
309
+ * The handler ONLY decides visibility. It never navigates, never acts on the
310
+ * notification, and never reads the payload for display — `decide` is handed the
311
+ * raw, untrusted `content.data` and may answer nothing but `'show'` /
312
+ * `'suppress'`. Acting on a notification stays with a TAP, routed by
313
+ * {@link subscribeToNotificationResponses}. No notification actions/categories
314
+ * are registered here, so the banner cannot carry an action button.
315
+ *
316
+ * The one-shot latch is set BEFORE the first `await`, so concurrent callers
317
+ * cannot both reach `setNotificationHandler`.
318
+ *
319
+ * @param decide - Maps the raw, untrusted payload to a presentation verdict.
320
+ * Must not throw; a throw is reported by the OS as a handling error and the
321
+ * notification is dropped.
322
+ * @returns Whether a handler was installed by THIS call (`false` on a repeat
323
+ * call, on web, or when the native module is unavailable).
324
+ */
325
+ export async function installForegroundNotificationHandler(
326
+ decide: (data: unknown) => ForegroundPresentation,
327
+ ): Promise<boolean> {
328
+ if (foregroundHandlerAttempted) {
329
+ return false;
330
+ }
331
+ foregroundHandlerAttempted = true;
332
+
333
+ const notifications = await loadNotifications();
334
+ if (!notifications) {
335
+ return false;
336
+ }
337
+ try {
338
+ notifications.setNotificationHandler({
339
+ handleNotification: async (notification) => {
340
+ const data: unknown = notification.request.content.data;
341
+ const show = decide(data) === 'show';
342
+ return {
343
+ // Banner: the whole point — make the notification visible on screen.
344
+ shouldShowBanner: show,
345
+ // Notification centre: so the user can still review it after
346
+ // dismissing the banner.
347
+ shouldShowList: show,
348
+ // No sound: the app is foregrounded, so the user is already looking at
349
+ // the screen the banner appears on.
350
+ shouldPlaySound: false,
351
+ // Badging is an app-level unread concept this adapter has no view of.
352
+ shouldSetBadge: false,
353
+ };
354
+ },
355
+ });
356
+ return true;
357
+ } catch (error) {
358
+ log.warn(
359
+ 'could not install the foreground notification handler',
360
+ { method: 'installForegroundNotificationHandler' },
361
+ error,
362
+ );
363
+ return false;
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Subscribe to notification TAPS (responses) while the app is running.
369
+ *
370
+ * @param listener - Receives the raw, untrusted `content.data` of the tapped
371
+ * notification. Parsing/validation is the caller's job.
372
+ * @returns An unsubscribe function. Safe to call even if the subscription could
373
+ * not be established.
374
+ */
375
+ export async function subscribeToNotificationResponses(
376
+ listener: (data: unknown) => void,
377
+ ): Promise<() => void> {
378
+ const notifications = await loadNotifications();
379
+ if (!notifications) {
380
+ return () => undefined;
381
+ }
382
+ try {
383
+ const subscription = notifications.addNotificationResponseReceivedListener((response) => {
384
+ listener(response.notification.request.content.data);
385
+ });
386
+ return () => subscription.remove();
387
+ } catch (error) {
388
+ log.warn(
389
+ 'could not subscribe to notification taps',
390
+ { method: 'subscribeToNotificationResponses' },
391
+ error,
392
+ );
393
+ return () => undefined;
394
+ }
395
+ }
@@ -0,0 +1,281 @@
1
+ /**
2
+ * `runProviderColdBoot` — the `webAuthMode` transport gate (#691 phase 7).
3
+ *
4
+ * `webAuthMode: 'popup'` must never let the boot navigate the RP's top-level
5
+ * window: no silent `prompt=none` restore, no authorize redirect, a signed-out
6
+ * domain simply resolves signed out. `'redirect'` — still the default and the
7
+ * compatibility path — must behave exactly as before.
8
+ *
9
+ * Unlike `__tests__/boot/runProviderColdBoot.test.ts` (deadline + connectivity
10
+ * wiring, with `crossOriginRestore` stubbed out), this suite keeps the restore
11
+ * lane REAL so the redirect-mode assertions reach the actual navigation
12
+ * primitive — the thing popup mode has to suppress.
13
+ */
14
+
15
+ import type { AuthStateStore, PersistedAuthState, SessionClient } from '@oxyhq/core';
16
+
17
+ // Only `runSessionColdBoot` and the origin-CLASSIFICATION predicates are faked.
18
+ // jsdom's `location` is non-configurable, so origin eligibility has to be driven
19
+ // through the predicates (their real behaviour is covered by core's own tests);
20
+ // everything else in core (PKCE, authorize-URL builder, handshake store) stays
21
+ // real so the redirect-mode lane is exercised end to end.
22
+ jest.mock('@oxyhq/core', () => {
23
+ const actual = jest.requireActual('@oxyhq/core');
24
+ return {
25
+ __esModule: true,
26
+ ...actual,
27
+ runSessionColdBoot: jest.fn(),
28
+ isLoopbackOrigin: jest.fn(() => false),
29
+ isOfficialWebOrigin: jest.fn(() => true),
30
+ isIdpHubOrigin: jest.fn(() => false),
31
+ };
32
+ });
33
+
34
+ // The ONLY top-level-window navigation primitive either lane can reach.
35
+ jest.mock('../../components/oauthNavigation', () => ({
36
+ redirectToAuthorize: jest.fn(),
37
+ }));
38
+
39
+ // Spied but REAL: redirect mode must still perform the actual restore.
40
+ jest.mock('../../utils/crossOriginRestore', () => {
41
+ const actual = jest.requireActual('../../utils/crossOriginRestore');
42
+ return {
43
+ __esModule: true,
44
+ ...actual,
45
+ maybeStartSilentOAuthRestore: jest.fn(actual.maybeStartSilentOAuthRestore),
46
+ consumeSilentOAuthError: jest.fn(actual.consumeSilentOAuthError),
47
+ };
48
+ });
49
+
50
+ jest.mock('../../utils/oauthReturn', () => {
51
+ const actual = jest.requireActual('../../utils/oauthReturn');
52
+ return {
53
+ __esModule: true,
54
+ ...actual,
55
+ tryCompleteOAuthReturn: jest.fn(async () => false),
56
+ consumeHubSyncFailure: jest.fn(actual.consumeHubSyncFailure),
57
+ };
58
+ });
59
+
60
+ import { runSessionColdBoot } from '@oxyhq/core';
61
+ import { redirectToAuthorize } from '../../components/oauthNavigation';
62
+ import {
63
+ clearCrossOriginRestoreGuards,
64
+ consumeSilentOAuthError,
65
+ maybeStartSilentOAuthRestore,
66
+ } from '../../utils/crossOriginRestore';
67
+ import { consumeHubSyncFailure, tryCompleteOAuthReturn } from '../../utils/oauthReturn';
68
+ import { runProviderColdBoot, type RunProviderColdBootOptions } from '../runProviderColdBoot';
69
+
70
+ const mockRunSessionColdBoot = runSessionColdBoot as jest.Mock;
71
+ const mockRedirectToAuthorize = redirectToAuthorize as jest.Mock;
72
+ const mockSilentRestore = maybeStartSilentOAuthRestore as jest.Mock;
73
+ const mockConsumeSilentOAuthError = consumeSilentOAuthError as jest.Mock;
74
+ const mockConsumeHubSyncFailure = consumeHubSyncFailure as jest.Mock;
75
+ const mockTryCompleteOAuthReturn = tryCompleteOAuthReturn as jest.Mock;
76
+
77
+ const CLIENT_ID = 'oxy_dk_test';
78
+
79
+ /** An auth store holding no device credential — the signed-out domain case. */
80
+ function makeEmptyAuthStore(): AuthStateStore {
81
+ return {
82
+ load: jest.fn(async (): Promise<PersistedAuthState | null> => null),
83
+ save: jest.fn(async () => undefined),
84
+ clear: jest.fn(async () => undefined),
85
+ } as unknown as AuthStateStore;
86
+ }
87
+
88
+ interface Harness {
89
+ options: RunProviderColdBootOptions;
90
+ commitSession: jest.Mock;
91
+ markAuthResolved: jest.Mock;
92
+ setTokenReady: jest.Mock;
93
+ sessionClientStart: jest.Mock;
94
+ }
95
+
96
+ function makeHarness(overrides: Partial<RunProviderColdBootOptions> = {}): Harness {
97
+ const commitSession = jest.fn(async () => undefined);
98
+ const markAuthResolved = jest.fn();
99
+ const setTokenReady = jest.fn();
100
+ const sessionClientStart = jest.fn(async () => undefined);
101
+
102
+ const options: RunProviderColdBootOptions = {
103
+ oxyServices: {} as RunProviderColdBootOptions['oxyServices'],
104
+ authStore: makeEmptyAuthStore(),
105
+ clientId: CLIENT_ID,
106
+ sessionClient: { start: sessionClientStart } as unknown as SessionClient,
107
+ syncDeviceCredentialToHost: jest.fn(async () => undefined),
108
+ commitSession,
109
+ markAuthResolved,
110
+ setTokenReady,
111
+ ...overrides,
112
+ };
113
+
114
+ return { options, commitSession, markAuthResolved, setTokenReady, sessionClientStart };
115
+ }
116
+
117
+ /** `runSessionColdBoot` finding no session at all — the signed-out domain. */
118
+ function stubSignedOutBoot(): void {
119
+ mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
120
+ await opts.onSignedOut?.('no_session');
121
+ return { kind: 'unauthenticated' } as const;
122
+ });
123
+ }
124
+
125
+ describe('runProviderColdBoot — webAuthMode transport gate (#691 phase 7)', () => {
126
+ beforeEach(() => {
127
+ mockRunSessionColdBoot.mockReset();
128
+ mockRedirectToAuthorize.mockClear();
129
+ mockSilentRestore.mockClear();
130
+ mockConsumeSilentOAuthError.mockClear();
131
+ mockConsumeHubSyncFailure.mockClear();
132
+ mockTryCompleteOAuthReturn.mockClear();
133
+ mockTryCompleteOAuthReturn.mockImplementation(async () => false);
134
+ globalThis.sessionStorage?.clear();
135
+ clearCrossOriginRestoreGuards();
136
+ });
137
+
138
+ describe("webAuthMode: 'popup'", () => {
139
+ it('never starts the silent restore and never navigates the top-level window', async () => {
140
+ stubSignedOutBoot();
141
+ const { options } = makeHarness({ webAuthMode: 'popup' });
142
+
143
+ await runProviderColdBoot(options);
144
+
145
+ expect(mockSilentRestore).not.toHaveBeenCalled();
146
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
147
+ });
148
+
149
+ it('resolves a domain with no local credential SIGNED OUT instead of bouncing', async () => {
150
+ stubSignedOutBoot();
151
+ const { options, markAuthResolved, commitSession, sessionClientStart } = makeHarness({
152
+ webAuthMode: 'popup',
153
+ });
154
+
155
+ await runProviderColdBoot(options);
156
+
157
+ // Auth resolution concluded (routing can settle), nothing was committed,
158
+ // and with no persisted credential the device socket is not started.
159
+ expect(markAuthResolved).toHaveBeenCalled();
160
+ expect(commitSession).not.toHaveBeenCalled();
161
+ expect(sessionClientStart).not.toHaveBeenCalled();
162
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
163
+ });
164
+
165
+ it('still completes an authorization code already on the URL (blocked-popup fallback)', async () => {
166
+ // A popup-mode app lands here whenever the browser blocked the popup and
167
+ // `startWebOAuthSignIn` fell back to a full-page redirect.
168
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
169
+ const { options, markAuthResolved, setTokenReady } = makeHarness({ webAuthMode: 'popup' });
170
+
171
+ await runProviderColdBoot(options);
172
+
173
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
174
+ expect(setTokenReady).toHaveBeenLastCalledWith(true);
175
+ expect(markAuthResolved).toHaveBeenCalled();
176
+ // The device mint is short-circuited by the completed return leg.
177
+ expect(mockRunSessionColdBoot).not.toHaveBeenCalled();
178
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
179
+ });
180
+
181
+ it('commits the OAuth return WITHOUT hub sync', async () => {
182
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
183
+ const { options } = makeHarness({ webAuthMode: 'popup' });
184
+
185
+ await runProviderColdBoot(options);
186
+
187
+ const commit = mockTryCompleteOAuthReturn.mock.calls[0][0] as {
188
+ commitSession: (input: unknown) => Promise<void>;
189
+ };
190
+ await commit.commitSession({ sessionId: 's1', userId: 'u1' });
191
+ expect(options.commitSession).toHaveBeenCalledWith(
192
+ { sessionId: 's1', userId: 'u1' },
193
+ { activate: true, hubSync: false },
194
+ );
195
+ });
196
+ });
197
+
198
+ describe("webAuthMode: 'redirect' (unchanged compatibility path)", () => {
199
+ it('starts the silent restore and navigates to the IdP with prompt=none', async () => {
200
+ stubSignedOutBoot();
201
+ const { options } = makeHarness({ webAuthMode: 'redirect' });
202
+
203
+ await runProviderColdBoot(options);
204
+
205
+ expect(mockSilentRestore).toHaveBeenCalledTimes(1);
206
+ expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
207
+ const url = new URL(mockRedirectToAuthorize.mock.calls[0][0] as string);
208
+ expect(url.origin + url.pathname).toBe('https://auth.oxy.so/authorize');
209
+ expect(url.searchParams.get('client_id')).toBe(CLIENT_ID);
210
+ expect(url.searchParams.get('prompt')).toBe('none');
211
+ });
212
+
213
+ it('is the DEFAULT when no webAuthMode is supplied', async () => {
214
+ stubSignedOutBoot();
215
+ const { options } = makeHarness();
216
+
217
+ await runProviderColdBoot(options);
218
+
219
+ expect(mockSilentRestore).toHaveBeenCalledTimes(1);
220
+ expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
221
+ });
222
+
223
+ it('does NOT restore when the mint already resolved a session', async () => {
224
+ mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
225
+ const session = { sessionId: 's1', userId: 'u1', accessToken: 'at', via: 'device-secret-mint' };
226
+ await opts.onSession?.(session);
227
+ return { kind: 'session', via: session.via, session } as const;
228
+ });
229
+ const { options, commitSession } = makeHarness({ webAuthMode: 'redirect' });
230
+
231
+ await runProviderColdBoot(options);
232
+
233
+ expect(commitSession).toHaveBeenCalledWith(
234
+ { sessionId: 's1', accessToken: 'at', userId: 'u1' },
235
+ { activate: false },
236
+ );
237
+ expect(mockSilentRestore).not.toHaveBeenCalled();
238
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
239
+ });
240
+ });
241
+
242
+ describe('URL-cleanup consumers run in BOTH modes', () => {
243
+ it.each(['popup', 'redirect'] as const)(
244
+ 'consumes the silent-OAuth error and hub-sync failure params (%s)',
245
+ async (webAuthMode) => {
246
+ stubSignedOutBoot();
247
+ const { options } = makeHarness({ webAuthMode });
248
+
249
+ await runProviderColdBoot(options);
250
+
251
+ expect(mockConsumeSilentOAuthError).toHaveBeenCalledTimes(1);
252
+ expect(mockConsumeHubSyncFailure).toHaveBeenCalledTimes(1);
253
+ },
254
+ );
255
+
256
+ it.each(['popup', 'redirect'] as const)(
257
+ 'consumes an authorization code left on the URL (%s)',
258
+ async (webAuthMode) => {
259
+ stubSignedOutBoot();
260
+ const { options } = makeHarness({ webAuthMode });
261
+
262
+ await runProviderColdBoot(options);
263
+
264
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
265
+ },
266
+ );
267
+ });
268
+
269
+ describe('identity mode still skips both web OAuth lanes in either transport', () => {
270
+ it.each(['popup', 'redirect'] as const)('skips the return leg and the restore (%s)', async (webAuthMode) => {
271
+ stubSignedOutBoot();
272
+ const { options } = makeHarness({ webAuthMode, sessionMode: 'identity' });
273
+
274
+ await runProviderColdBoot(options);
275
+
276
+ expect(mockTryCompleteOAuthReturn).not.toHaveBeenCalled();
277
+ expect(mockSilentRestore).not.toHaveBeenCalled();
278
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
279
+ });
280
+ });
281
+ });