@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,187 @@
1
+ /**
2
+ * The single web entry point for third-party "Sign in with Oxy".
3
+ *
4
+ * Picks the transport (`popup` or `redirect`), drives it, and returns ONE typed
5
+ * result — so callers (`OxySignInButton`, and any RP with its own button) never
6
+ * touch `window.open`, `postMessage`, or the token exchange themselves.
7
+ *
8
+ * Popup mode keeps the relying party mounted: its route, scroll position, and
9
+ * unsaved state survive because the tab never navigates. Redirect mode is the
10
+ * compatibility fallback, and is also where popup mode lands when the browser
11
+ * blocks the window — a blocked popup must still sign the user in, not dead-end.
12
+ *
13
+ * Native is NOT handled here: `openAuthorizeUrlNative` (an in-app auth session)
14
+ * remains the native lane and is untouched by this module.
15
+ */
16
+
17
+ import { logger, persistOAuthHandshake } from '@oxyhq/core';
18
+ import type { OxyServices } from '@oxyhq/core';
19
+ import { redirectToAuthorize } from '../components/oauthNavigation';
20
+ import { isWebBrowser } from '../utils/isWebBrowser';
21
+ import { completeOAuthCode } from './completeOAuthCode';
22
+ import { prepareAuthorizeRequest } from './oauthHandshake';
23
+ import { awaitOAuthPopupResult, closeOAuthPopup, navigateOAuthPopup, openOAuthPopup } from './oauthPopup';
24
+ import type {
25
+ OAuthPopupHandle,
26
+ OAuthSessionCommitInput,
27
+ WebAuthMode,
28
+ WebOAuthRedirectReason,
29
+ WebOAuthSignInResult,
30
+ } from './types';
31
+
32
+ /** Provider-owned wiring for a web sign-in — everything that is not per-press. */
33
+ export interface WebOAuthTransportContext {
34
+ /** The provider's `webAuthMode`. */
35
+ mode: WebAuthMode;
36
+ oxyServices: OxyServices;
37
+ /** The app's registered client id; `null` disables third-party sign-in. */
38
+ clientId: string | null;
39
+ /** Authorize endpoint override (local/staging deployments). */
40
+ authorizeBaseUrl?: string;
41
+ /** `sessionMode: 'identity'` — no third-party OAuth lane exists by design. */
42
+ identityBound: boolean;
43
+ /** The provider's session commit funnel. */
44
+ commitSession: (input: OAuthSessionCommitInput) => Promise<void>;
45
+ }
46
+
47
+ /** Per-press inputs for {@link startWebOAuthSignIn}. */
48
+ export interface StartWebOAuthSignInOptions {
49
+ /** EXACT registered redirect URI for this application. */
50
+ redirectUri: string;
51
+ /**
52
+ * The popup to drive, when the caller already opened one.
53
+ *
54
+ * - omitted — this call opens the window itself, which is only valid when it
55
+ * was invoked SYNCHRONOUSLY from the user's click (gesture attribution);
56
+ * - `null` — the caller tried and the browser blocked it: fall back to a
57
+ * full-page redirect;
58
+ * - a handle — use exactly this window.
59
+ *
60
+ * Callers that must `await` before signing in (resolving the application, for
61
+ * instance) have to open the window in their press handler and pass it here;
62
+ * a window opened after an `await` is silently blocked by every browser.
63
+ */
64
+ popup?: OAuthPopupHandle | null;
65
+ /** Requested scope; defaults to the SDK's standard sign-in scope. */
66
+ scope?: string;
67
+ /** Popup timeout override (ms). */
68
+ timeoutMs?: number;
69
+ }
70
+
71
+ export async function startWebOAuthSignIn(
72
+ context: WebOAuthTransportContext,
73
+ options: StartWebOAuthSignInOptions,
74
+ ): Promise<WebOAuthSignInResult> {
75
+ if (!isWebBrowser()) {
76
+ closeOAuthPopup(options.popup ?? null);
77
+ return { status: 'unsupported', reason: 'no-browser' };
78
+ }
79
+ if (context.identityBound) {
80
+ closeOAuthPopup(options.popup ?? null);
81
+ return { status: 'unsupported', reason: 'identity-bound' };
82
+ }
83
+ if (!context.clientId) {
84
+ closeOAuthPopup(options.popup ?? null);
85
+ return { status: 'unsupported', reason: 'missing-client-id' };
86
+ }
87
+
88
+ // Claim the window BEFORE the first `await` below, so a caller that invoked us
89
+ // straight from the click still has gesture attribution. An explicit `null`
90
+ // means the caller already tried and was blocked.
91
+ const popup =
92
+ context.mode === 'popup' && options.popup === undefined ? openOAuthPopup() : options.popup ?? null;
93
+
94
+ if (context.mode === 'redirect') {
95
+ closeOAuthPopup(popup);
96
+ return startRedirectSignIn(context, options, 'redirect-mode');
97
+ }
98
+ if (!popup) {
99
+ logger.warn('OAuth sign-in popup was blocked; falling back to a full-page redirect', {
100
+ component: 'browserAuthTransport',
101
+ });
102
+ return startRedirectSignIn(context, options, 'popup-blocked');
103
+ }
104
+
105
+ const prepared = await prepareAuthorizeRequest({
106
+ clientId: context.clientId,
107
+ redirectUri: options.redirectUri,
108
+ authorizeBaseUrl: context.authorizeBaseUrl,
109
+ scope: options.scope,
110
+ responseMode: 'web_message',
111
+ });
112
+
113
+ if (!navigateOAuthPopup(popup, prepared.authorizeUrl)) {
114
+ closeOAuthPopup(popup);
115
+ return startRedirectSignIn(context, options, 'popup-navigation-failed');
116
+ }
117
+
118
+ const outcome = await awaitOAuthPopupResult({
119
+ popup,
120
+ expectedOrigin: prepared.authorizeOrigin,
121
+ expectedState: prepared.handshake.state,
122
+ ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
123
+ });
124
+ // The IdP closes itself after delivering; this covers every other outcome
125
+ // (timeout, mismatch, an error the IdP reported before closing).
126
+ closeOAuthPopup(popup);
127
+
128
+ switch (outcome.kind) {
129
+ case 'code': {
130
+ const completion = await completeOAuthCode({
131
+ oxyServices: context.oxyServices,
132
+ clientId: context.clientId,
133
+ code: outcome.code,
134
+ returnedState: outcome.state,
135
+ handshake: prepared.handshake,
136
+ redirectUri: options.redirectUri,
137
+ commitSession: context.commitSession,
138
+ });
139
+ return completion.ok
140
+ ? { status: 'signed-in' }
141
+ : { status: 'failed', reason: completion.reason };
142
+ }
143
+ case 'oauth-error':
144
+ return {
145
+ status: 'failed',
146
+ reason: 'idp-error',
147
+ description: outcome.errorDescription ?? outcome.error,
148
+ };
149
+ case 'state-mismatch':
150
+ return { status: 'failed', reason: 'state-mismatch' };
151
+ case 'closed':
152
+ return { status: 'cancelled' };
153
+ case 'timed-out':
154
+ return { status: 'timed-out' };
155
+ case 'unsupported':
156
+ return { status: 'unsupported', reason: 'no-browser' };
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Full-page hand-off to the IdP. The document is destroyed by the navigation, so
162
+ * the handshake MUST reach `sessionStorage` first — without it the return trip
163
+ * cannot validate `state`, and starting the redirect anyway would strand the
164
+ * user at a callback that can only refuse them.
165
+ */
166
+ async function startRedirectSignIn(
167
+ context: WebOAuthTransportContext,
168
+ options: StartWebOAuthSignInOptions,
169
+ via: WebOAuthRedirectReason,
170
+ ): Promise<WebOAuthSignInResult> {
171
+ // Narrowed by the caller; repeated here so this helper is safe on its own.
172
+ if (!context.clientId) return { status: 'unsupported', reason: 'missing-client-id' };
173
+
174
+ const prepared = await prepareAuthorizeRequest({
175
+ clientId: context.clientId,
176
+ redirectUri: options.redirectUri,
177
+ authorizeBaseUrl: context.authorizeBaseUrl,
178
+ scope: options.scope,
179
+ });
180
+
181
+ if (!persistOAuthHandshake(prepared.handshake.state, prepared.handshake.codeVerifier)) {
182
+ return { status: 'failed', reason: 'handshake-storage' };
183
+ }
184
+
185
+ redirectToAuthorize(prepared.authorizeUrl);
186
+ return { status: 'redirecting', via };
187
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * The ONE path from an OAuth authorization code to a committed session.
3
+ *
4
+ * Both web transports end here — the popup with an in-memory handshake, the
5
+ * redirect lane with one read back from `sessionStorage` — so state validation,
6
+ * the PKCE exchange, the session commit, and handshake cleanup exist exactly
7
+ * once. Duplicating any of those per transport is how the two lanes would drift
8
+ * apart on the security-critical steps.
9
+ *
10
+ * Ordering is deliberate and load-bearing:
11
+ * 1. validate `state` BEFORE anything is sent to the token endpoint,
12
+ * 2. exchange the code for a session,
13
+ * 3. run `cleanup` (drop the persisted handshake / strip `?code=` from the
14
+ * URL) BEFORE the commit, so a stale code can never re-enter the exchange,
15
+ * 4. commit the session.
16
+ *
17
+ * `cleanup` runs exactly once on EVERY exit path, including a state mismatch
18
+ * and a failed exchange.
19
+ */
20
+
21
+ import type { OxyServices } from '@oxyhq/core';
22
+ import { logger } from '@oxyhq/core';
23
+ import type { OAuthCompletionResult, OAuthHandshake, OAuthSessionCommitInput } from './types';
24
+
25
+ /** Inputs for {@link completeOAuthCode}. */
26
+ export interface CompleteOAuthCodeInput {
27
+ oxyServices: OxyServices;
28
+ /** The registered `ApplicationCredential` public key (`oxy_dk_…`). */
29
+ clientId: string;
30
+ /** The single-use authorization code the IdP issued. */
31
+ code: string;
32
+ /** The `state` the IdP returned, or `null` when it sent none. */
33
+ returnedState: string | null;
34
+ /**
35
+ * The handshake this RP started the authorize request with, or `null` when it
36
+ * is gone (never stored, expired, or a different tab's). A missing handshake
37
+ * is treated exactly like a mismatched `state`: no exchange is attempted.
38
+ */
39
+ handshake: OAuthHandshake | null;
40
+ /** EXACT redirect URI sent on the authorize request — OAuth requires a match. */
41
+ redirectUri: string;
42
+ /** The provider's session commit funnel. */
43
+ commitSession: (input: OAuthSessionCommitInput) => Promise<void>;
44
+ /**
45
+ * Transport-specific teardown, invoked once after the exchange settles and
46
+ * before the commit. The redirect lane strips `?code=` and clears the
47
+ * persisted handshake; the popup lane has nothing persisted and omits it.
48
+ */
49
+ cleanup?: () => void;
50
+ }
51
+
52
+ export async function completeOAuthCode(
53
+ input: CompleteOAuthCodeInput,
54
+ ): Promise<OAuthCompletionResult> {
55
+ let cleaned = false;
56
+ const runCleanup = (): void => {
57
+ if (cleaned) return;
58
+ cleaned = true;
59
+ input.cleanup?.();
60
+ };
61
+
62
+ if (!input.handshake || !input.returnedState || input.handshake.state !== input.returnedState) {
63
+ logger.warn('OAuth completion rejected: missing or mismatched state', {
64
+ component: 'completeOAuthCode',
65
+ });
66
+ runCleanup();
67
+ return { ok: false, reason: 'state-mismatch' };
68
+ }
69
+
70
+ try {
71
+ const result = await input.oxyServices.exchangeOAuthCode({
72
+ code: input.code,
73
+ clientId: input.clientId,
74
+ redirectUri: input.redirectUri,
75
+ codeVerifier: input.handshake.codeVerifier,
76
+ });
77
+ runCleanup();
78
+ await input.commitSession({
79
+ sessionId: result.sessionId,
80
+ accessToken: result.accessToken,
81
+ deviceId: result.deviceId,
82
+ deviceSecret: result.deviceSecret,
83
+ userId: result.user.id,
84
+ expiresAt: result.expiresAt,
85
+ user: result.user,
86
+ });
87
+ return { ok: true };
88
+ } catch (error) {
89
+ logger.warn('OAuth code exchange failed', { component: 'completeOAuthCode' }, error);
90
+ runCleanup();
91
+ return { ok: false, reason: 'exchange-failed' };
92
+ }
93
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
3
+ * to the IdP without a user gesture.
4
+ *
5
+ * `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
6
+ * party never leaves its route. Two mechanics in this SDK break that guarantee,
7
+ * because each replaces the whole document on its own initiative:
8
+ *
9
+ * 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
10
+ * to `auth.oxy.so` when the device-secret mint finds no local session
11
+ * (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
12
+ * 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
13
+ * plants this device's credential on the IdP hub so OTHER origins can later
14
+ * run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
15
+ *
16
+ * Both belong to the redirect transport and are kept only for the migration
17
+ * window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
18
+ * domain with no local credential simply resolves SIGNED OUT, and the user's
19
+ * next explicit "Continue with Oxy" opens the popup — from a real user gesture,
20
+ * never automatically.
21
+ *
22
+ * NOT covered here, and correctly enabled in BOTH modes: navigations the user
23
+ * asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
24
+ * falls back to a full-page redirect rather than dead-ending the sign-in, and
25
+ * `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
26
+ *
27
+ * PHASE 7b: once the pilot flips the default transport to `'popup'`, this
28
+ * predicate and BOTH lanes above are deleted outright. Grepping this symbol
29
+ * finds every site that has to go.
30
+ */
31
+
32
+ import type { WebAuthMode } from './types';
33
+
34
+ /**
35
+ * Whether a provider running `webAuthMode` may perform an SDK-initiated,
36
+ * non-gesture, full-page navigation to the IdP.
37
+ *
38
+ * `true` only for `'redirect'` — still the default and the compatibility path,
39
+ * whose behaviour must stay byte-for-byte unchanged.
40
+ */
41
+ export function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean {
42
+ return webAuthMode === 'redirect';
43
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The RP half of an OAuth authorize request: a fresh CSRF `state` + PKCE pair,
3
+ * and the authorize URL built from them.
4
+ *
5
+ * Both web transports start here, and the ONLY difference between them is one
6
+ * parameter: `popup` asks the IdP for `response_mode=web_message` so the result
7
+ * comes back to `window.opener` instead of navigating the RP's tab. Everything
8
+ * else — `S256` PKCE, exact registered `redirect_uri`, random `state` — is
9
+ * identical, which is what lets both lanes converge on one completion path.
10
+ */
11
+
12
+ import { buildOAuthAuthorizeUrl, generateOAuthState, generatePkcePair } from '@oxyhq/core';
13
+ import type { OAuthHandshake } from './types';
14
+
15
+ /** Inputs for {@link prepareAuthorizeRequest}. */
16
+ export interface PrepareAuthorizeRequestParams {
17
+ /** The registered `ApplicationCredential` public key (`oxy_dk_…`). */
18
+ clientId: string;
19
+ /** EXACT registered redirect URI. The token exchange must replay this value. */
20
+ redirectUri: string;
21
+ /** Authorize endpoint override; defaults to the production Oxy IdP. */
22
+ authorizeBaseUrl?: string;
23
+ /** Requested scope; defaults to the SDK's standard sign-in scope. */
24
+ scope?: string;
25
+ /**
26
+ * Ask the IdP to deliver the result to `window.opener` via `postMessage`
27
+ * instead of redirecting. Set ONLY by the popup transport. It is a request,
28
+ * not a guarantee — an IdP with no opener still redirects.
29
+ */
30
+ responseMode?: 'web_message';
31
+ }
32
+
33
+ /** A ready-to-use authorize request plus the secrets that finish it. */
34
+ export interface PreparedAuthorizeRequest {
35
+ /** Fully-built `auth.oxy.so/authorize` URL. */
36
+ authorizeUrl: string;
37
+ /**
38
+ * Exact origin of {@link authorizeUrl}. The popup transport accepts
39
+ * `postMessage` from this origin and no other.
40
+ */
41
+ authorizeOrigin: string;
42
+ /** The `state` + PKCE verifier this request is bound to. */
43
+ handshake: OAuthHandshake;
44
+ }
45
+
46
+ /**
47
+ * Generate a fresh handshake and build the authorize URL around it.
48
+ *
49
+ * The verifier is returned to the caller and never stored here: the popup
50
+ * transport keeps it in memory for the lifetime of the attempt, and the
51
+ * redirect transport persists it through `persistOAuthHandshake` because a
52
+ * full-page navigation destroys the running document.
53
+ */
54
+ export async function prepareAuthorizeRequest(
55
+ params: PrepareAuthorizeRequestParams,
56
+ ): Promise<PreparedAuthorizeRequest> {
57
+ const [pkce, state] = await Promise.all([generatePkcePair(), generateOAuthState()]);
58
+
59
+ const authorizeUrl = buildOAuthAuthorizeUrl({
60
+ authorizeBaseUrl: params.authorizeBaseUrl,
61
+ clientId: params.clientId,
62
+ redirectUri: params.redirectUri,
63
+ scope: params.scope,
64
+ state,
65
+ codeChallenge: pkce.codeChallenge,
66
+ ...(params.responseMode ? { responseMode: params.responseMode } : {}),
67
+ });
68
+
69
+ return {
70
+ authorizeUrl,
71
+ authorizeOrigin: new URL(authorizeUrl).origin,
72
+ handshake: { state, codeVerifier: pkce.codeVerifier },
73
+ };
74
+ }
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Popup lifecycle for the web OAuth transport.
3
+ *
4
+ * Owns the window itself — opening it, navigating it, watching it, and tearing
5
+ * every listener and timer down — and nothing else: message validation lives in
6
+ * `oauthPopupMessages.ts`, and the code exchange in `completeOAuthCode.ts`.
7
+ *
8
+ * Three browser realities shape this module:
9
+ *
10
+ * - **Gesture attribution.** `window.open` only succeeds while the user's click
11
+ * is still being handled. Anything awaited first (resolving the application,
12
+ * generating PKCE) loses it and the popup is silently blocked. So the window
13
+ * is opened EMPTY up front and navigated once the authorize URL exists —
14
+ * the same shape as `passkeyHubPopup.ts`.
15
+ * - **No close event.** A cross-origin popup fires nothing when the user
16
+ * dismisses it; polling `closed` is the only mechanism (as in core's
17
+ * `AccountDialogController.watchPopup`).
18
+ * - **No cross-origin reads.** The popup's URL, title, and document are all
19
+ * opaque. The authorization result arrives ONLY as a `postMessage`.
20
+ */
21
+
22
+ import { logger } from '@oxyhq/core';
23
+ import { readOAuthPopupMessage } from './oauthPopupMessages';
24
+ import type { OAuthPopupHandle, OAuthPopupOutcome } from './types';
25
+
26
+ /**
27
+ * Window name for the sign-in popup. Naming the target means a second press
28
+ * REUSES the same window instead of stacking a new one behind the first.
29
+ */
30
+ export const OXY_OAUTH_POPUP_WINDOW_NAME = 'oxy-oauth';
31
+
32
+ /** Chrome-free window roughly sized for the IdP's sign-in / QR surface. */
33
+ const POPUP_FEATURES = 'popup=yes,width=460,height=700,menubar=no,toolbar=no,location=no,status=no';
34
+
35
+ /**
36
+ * How long a popup sign-in may stay unanswered (ms).
37
+ *
38
+ * Generous on purpose: the IdP surface can involve scanning a QR and approving
39
+ * on a phone, so this tracks the authorize handle's own ~5-minute lifetime
40
+ * rather than a UI-scale timeout. It is a backstop against a wedged popup, not
41
+ * a pace-setter — a user who gives up closes the window and gets the faster
42
+ * `closed` outcome.
43
+ */
44
+ export const DEFAULT_OAUTH_POPUP_TIMEOUT_MS = 300_000;
45
+
46
+ /** How often the popup's `closed` flag is sampled (ms). */
47
+ const CLOSE_POLL_INTERVAL_MS = 1000;
48
+
49
+ /**
50
+ * Grace period (ms) after `closed` flips before reporting cancellation.
51
+ *
52
+ * The IdP posts its result and THEN closes itself. Both land as separate tasks,
53
+ * so a poll tick that happens to fall between them would otherwise turn a
54
+ * successful sign-in into a "user cancelled". One short grace window lets the
55
+ * already-queued message win.
56
+ */
57
+ const CLOSE_GRACE_MS = 400;
58
+
59
+ /** The `message` half of the DOM host, absent on native and during SSR. */
60
+ interface MessageEventHost {
61
+ addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
62
+ removeEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
63
+ }
64
+
65
+ /** The `open` half of the DOM host, absent on native and during SSR. */
66
+ interface PopupOpenerHost {
67
+ open?: (url: string, target: string, features: string) => OAuthPopupHandle | null;
68
+ }
69
+
70
+ function messageEventHost(): MessageEventHost | null {
71
+ const win = (globalThis as { window?: Partial<MessageEventHost> }).window;
72
+ if (!win || typeof win.addEventListener !== 'function' || typeof win.removeEventListener !== 'function') {
73
+ return null;
74
+ }
75
+ return win as MessageEventHost;
76
+ }
77
+
78
+ /**
79
+ * Open a new, EMPTY sign-in popup.
80
+ *
81
+ * MUST be called SYNCHRONOUSLY from a user-gesture handler, before any `await`.
82
+ * Returns `null` when the browser blocked it, when `window.open` threw, and on
83
+ * hosts with no DOM (native / SSR) — never throws, because "no popup" is an
84
+ * ordinary outcome the caller answers by falling back to a redirect.
85
+ */
86
+ export function openOAuthPopup(): OAuthPopupHandle | null {
87
+ const win = (globalThis as { window?: PopupOpenerHost }).window;
88
+ if (!win || typeof win.open !== 'function') return null;
89
+ try {
90
+ return win.open('', OXY_OAUTH_POPUP_WINDOW_NAME, POPUP_FEATURES) ?? null;
91
+ } catch (error) {
92
+ logger.warn('Could not open the OAuth sign-in popup', { component: 'oauthPopup' }, error);
93
+ return null;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Point an already-open popup at the authorize URL. Returns `false` when the
99
+ * assignment threw (a window closed between opening and navigating), so the
100
+ * caller can fall back to a redirect instead of waiting on a dead window.
101
+ */
102
+ export function navigateOAuthPopup(popup: OAuthPopupHandle, url: string): boolean {
103
+ try {
104
+ popup.location.href = url;
105
+ return true;
106
+ } catch (error) {
107
+ logger.warn('Could not navigate the OAuth sign-in popup', { component: 'oauthPopup' }, error);
108
+ return false;
109
+ }
110
+ }
111
+
112
+ /** Close the popup if it is still open. Idempotent, null-safe, never throws. */
113
+ export function closeOAuthPopup(popup: OAuthPopupHandle | null): void {
114
+ if (!popup || popup.closed) return;
115
+ try {
116
+ popup.close();
117
+ } catch (error) {
118
+ logger.debug('OAuth popup close failed', { component: 'oauthPopup' }, error);
119
+ }
120
+ }
121
+
122
+ /** Inputs for {@link awaitOAuthPopupResult}. */
123
+ export interface AwaitOAuthPopupOptions {
124
+ /** The exact window reference returned by {@link openOAuthPopup}. */
125
+ popup: OAuthPopupHandle;
126
+ /** Exact origin the IdP will post from (`new URL(authorizeUrl).origin`). */
127
+ expectedOrigin: string;
128
+ /** The CSRF `state` sent on the authorize request. */
129
+ expectedState: string;
130
+ /** @default DEFAULT_OAUTH_POPUP_TIMEOUT_MS */
131
+ timeoutMs?: number;
132
+ }
133
+
134
+ /**
135
+ * Wait for the popup to deliver an authorization result.
136
+ *
137
+ * Settles EXACTLY once, with a typed outcome for every path — code, IdP error,
138
+ * state mismatch, user-closed, timeout — and removes its listener, its close
139
+ * poll, and both timers before resolving, whatever the outcome. Messages that
140
+ * arrive after settling reach nothing, so a duplicate delivery is inert.
141
+ *
142
+ * Never rejects: closing the window and running out of time are expected
143
+ * outcomes, not exceptions.
144
+ */
145
+ export function awaitOAuthPopupResult(
146
+ options: AwaitOAuthPopupOptions,
147
+ ): Promise<OAuthPopupOutcome> {
148
+ const { popup, expectedOrigin, expectedState, timeoutMs = DEFAULT_OAUTH_POPUP_TIMEOUT_MS } =
149
+ options;
150
+
151
+ const host = messageEventHost();
152
+ if (!host) return Promise.resolve({ kind: 'unsupported' });
153
+
154
+ return new Promise<OAuthPopupOutcome>((resolve) => {
155
+ let settled = false;
156
+ let timeoutTimer: ReturnType<typeof setTimeout> | null = null;
157
+ let closeGraceTimer: ReturnType<typeof setTimeout> | null = null;
158
+ let closePoll: ReturnType<typeof setInterval> | null = null;
159
+
160
+ const onMessage = (event: MessageEvent): void => {
161
+ const verdict = readOAuthPopupMessage(event, { expectedOrigin, expectedState, popup });
162
+ switch (verdict.kind) {
163
+ case 'ignore':
164
+ return;
165
+ case 'code':
166
+ settle({ kind: 'code', code: verdict.code, state: verdict.state });
167
+ return;
168
+ case 'oauth-error':
169
+ settle({
170
+ kind: 'oauth-error',
171
+ error: verdict.error,
172
+ ...(verdict.errorDescription ? { errorDescription: verdict.errorDescription } : {}),
173
+ });
174
+ return;
175
+ case 'state-mismatch':
176
+ settle({ kind: 'state-mismatch' });
177
+ return;
178
+ }
179
+ };
180
+
181
+ const cleanup = (): void => {
182
+ host.removeEventListener('message', onMessage);
183
+ if (timeoutTimer !== null) {
184
+ clearTimeout(timeoutTimer);
185
+ timeoutTimer = null;
186
+ }
187
+ if (closeGraceTimer !== null) {
188
+ clearTimeout(closeGraceTimer);
189
+ closeGraceTimer = null;
190
+ }
191
+ if (closePoll !== null) {
192
+ clearInterval(closePoll);
193
+ closePoll = null;
194
+ }
195
+ };
196
+
197
+ function settle(outcome: OAuthPopupOutcome): void {
198
+ if (settled) return;
199
+ settled = true;
200
+ cleanup();
201
+ resolve(outcome);
202
+ }
203
+
204
+ host.addEventListener('message', onMessage);
205
+
206
+ timeoutTimer = setTimeout(() => settle({ kind: 'timed-out' }), timeoutMs);
207
+
208
+ closePoll = setInterval(() => {
209
+ if (!popup.closed) return;
210
+ // Stop sampling immediately: the window is gone and only the in-flight
211
+ // message (if any) can still change the outcome.
212
+ if (closePoll !== null) {
213
+ clearInterval(closePoll);
214
+ closePoll = null;
215
+ }
216
+ closeGraceTimer = setTimeout(() => settle({ kind: 'closed' }), CLOSE_GRACE_MS);
217
+ }, CLOSE_POLL_INTERVAL_MS);
218
+ });
219
+ }