@oxyhq/services 5.17.17 → 5.17.18

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 (403) hide show
  1. package/README.md +32 -38
  2. package/lib/commonjs/core/CrossDomainAuth.js +277 -0
  3. package/lib/commonjs/core/CrossDomainAuth.js.map +1 -0
  4. package/lib/commonjs/core/HttpService.js +82 -15
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/OxyServices.base.js +11 -3
  7. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  8. package/lib/commonjs/core/OxyServices.js +4 -1
  9. package/lib/commonjs/core/OxyServices.js.map +1 -1
  10. package/lib/commonjs/core/index.js +30 -0
  11. package/lib/commonjs/core/index.js.map +1 -1
  12. package/lib/commonjs/core/mixins/OxyServices.assets.js +16 -3
  13. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  14. package/lib/commonjs/core/mixins/OxyServices.auth.js +73 -32
  15. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
  16. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
  17. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
  18. package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
  19. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
  20. package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
  21. package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
  22. package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
  23. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  24. package/lib/commonjs/core/mixins/index.js +27 -15
  25. package/lib/commonjs/core/mixins/index.js.map +1 -1
  26. package/lib/commonjs/crypto/index.js +30 -0
  27. package/lib/commonjs/crypto/index.js.map +1 -1
  28. package/lib/commonjs/crypto/keyManager.js +902 -0
  29. package/lib/commonjs/crypto/keyManager.js.map +1 -0
  30. package/lib/commonjs/crypto/polyfill.js +14 -5
  31. package/lib/commonjs/crypto/polyfill.js.map +1 -1
  32. package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
  33. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
  34. package/lib/commonjs/crypto/signatureService.js +289 -0
  35. package/lib/commonjs/crypto/signatureService.js.map +1 -0
  36. package/lib/commonjs/i18n/locales/en-US.json +1 -1
  37. package/lib/commonjs/index.js +40 -26
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/models/interfaces.js +0 -15
  40. package/lib/commonjs/models/interfaces.js.map +1 -1
  41. package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
  42. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  43. package/lib/commonjs/ui/components/Icon.js.map +1 -1
  44. package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
  45. package/lib/commonjs/ui/components/OxyProvider.js +41 -11
  46. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  47. package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
  48. package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
  49. package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
  50. package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
  51. package/lib/commonjs/ui/context/OxyContext.js +110 -199
  52. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  53. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
  54. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  55. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
  56. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
  57. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +79 -72
  58. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  59. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
  60. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  61. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
  62. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  63. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
  64. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  65. package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
  66. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  67. package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
  68. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  69. package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
  70. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  71. package/lib/commonjs/ui/hooks/useStorage.js +24 -58
  72. package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
  73. package/lib/commonjs/ui/index.js +50 -21
  74. package/lib/commonjs/ui/index.js.map +1 -1
  75. package/lib/commonjs/ui/navigation/routes.js +5 -1
  76. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  77. package/lib/commonjs/ui/screens/AccountCenterScreen.js +2 -2
  78. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  79. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
  81. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
  83. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
  85. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
  87. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  88. package/lib/commonjs/ui/stores/accountStore.js +2 -4
  89. package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
  90. package/lib/commonjs/ui/stores/authStore.js +45 -32
  91. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  92. package/lib/commonjs/ui/styles/spacing.js +54 -2
  93. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  94. package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
  95. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  96. package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
  97. package/lib/commonjs/utils/errorUtils.js +13 -0
  98. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  99. package/lib/commonjs/utils/validationUtils.js +15 -1
  100. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  101. package/lib/module/core/CrossDomainAuth.js +271 -0
  102. package/lib/module/core/CrossDomainAuth.js.map +1 -0
  103. package/lib/module/core/HttpService.js +82 -15
  104. package/lib/module/core/HttpService.js.map +1 -1
  105. package/lib/module/core/OxyServices.base.js +11 -4
  106. package/lib/module/core/OxyServices.base.js.map +1 -1
  107. package/lib/module/core/OxyServices.js +4 -1
  108. package/lib/module/core/OxyServices.js.map +1 -1
  109. package/lib/module/core/index.js +6 -1
  110. package/lib/module/core/index.js.map +1 -1
  111. package/lib/module/core/mixins/OxyServices.assets.js +16 -3
  112. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  113. package/lib/module/core/mixins/OxyServices.auth.js +73 -32
  114. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  115. package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
  116. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
  117. package/lib/module/core/mixins/OxyServices.popup.js +349 -0
  118. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
  119. package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
  120. package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
  121. package/lib/module/core/mixins/OxyServices.user.js +35 -24
  122. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  123. package/lib/module/core/mixins/index.js +15 -3
  124. package/lib/module/core/mixins/index.js.map +1 -1
  125. package/lib/module/crypto/index.js +8 -4
  126. package/lib/module/crypto/index.js.map +1 -1
  127. package/lib/module/crypto/keyManager.js +899 -0
  128. package/lib/module/crypto/keyManager.js.map +1 -0
  129. package/lib/module/crypto/polyfill.js +6 -5
  130. package/lib/module/crypto/polyfill.js.map +1 -1
  131. package/lib/module/crypto/recoveryPhrase.js +147 -0
  132. package/lib/module/crypto/recoveryPhrase.js.map +1 -0
  133. package/lib/module/crypto/signatureService.js +286 -0
  134. package/lib/module/crypto/signatureService.js.map +1 -0
  135. package/lib/module/i18n/locales/en-US.json +1 -1
  136. package/lib/module/index.js +6 -9
  137. package/lib/module/index.js.map +1 -1
  138. package/lib/module/models/interfaces.js +0 -15
  139. package/lib/module/models/interfaces.js.map +1 -1
  140. package/lib/module/ui/components/BottomSheetRouter.js +6 -2
  141. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  142. package/lib/module/ui/components/Icon.js.map +1 -1
  143. package/lib/module/ui/components/IconButton/utils.js.map +1 -1
  144. package/lib/module/ui/components/OxyProvider.js +41 -11
  145. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  146. package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
  147. package/lib/module/ui/components/TextField/helpers.js.map +1 -1
  148. package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
  149. package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
  150. package/lib/module/ui/context/OxyContext.js +112 -191
  151. package/lib/module/ui/context/OxyContext.js.map +1 -1
  152. package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
  153. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  154. package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
  155. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
  156. package/lib/module/ui/hooks/mutations/useAccountMutations.js +80 -72
  157. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  158. package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
  159. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  160. package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
  161. package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  162. package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
  163. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  164. package/lib/module/ui/hooks/useProfileEditing.js +3 -5
  165. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  166. package/lib/module/ui/hooks/useSessionManagement.js +4 -8
  167. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  168. package/lib/module/ui/hooks/useSessionSocket.js +162 -315
  169. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  170. package/lib/module/ui/hooks/useStorage.js +25 -59
  171. package/lib/module/ui/hooks/useStorage.js.map +1 -1
  172. package/lib/module/ui/index.js +15 -10
  173. package/lib/module/ui/index.js.map +1 -1
  174. package/lib/module/ui/navigation/routes.js +5 -1
  175. package/lib/module/ui/navigation/routes.js.map +1 -1
  176. package/lib/module/ui/screens/AccountCenterScreen.js +2 -2
  177. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  178. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  179. package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
  180. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  181. package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
  182. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  183. package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
  184. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  185. package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
  186. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  187. package/lib/module/ui/stores/accountStore.js +2 -4
  188. package/lib/module/ui/stores/accountStore.js.map +1 -1
  189. package/lib/module/ui/stores/authStore.js +45 -32
  190. package/lib/module/ui/stores/authStore.js.map +1 -1
  191. package/lib/module/ui/styles/spacing.js +6 -2
  192. package/lib/module/ui/styles/spacing.js.map +1 -1
  193. package/lib/module/ui/utils/avatarUtils.js +37 -40
  194. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  195. package/lib/module/ui/utils/storageHelpers.js.map +1 -1
  196. package/lib/module/utils/errorUtils.js +7 -0
  197. package/lib/module/utils/errorUtils.js.map +1 -1
  198. package/lib/module/utils/validationUtils.js +13 -0
  199. package/lib/module/utils/validationUtils.js.map +1 -1
  200. package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
  201. package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
  202. package/lib/typescript/core/HttpService.d.ts +1 -1
  203. package/lib/typescript/core/HttpService.d.ts.map +1 -1
  204. package/lib/typescript/core/OxyServices.base.d.ts +0 -6
  205. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  206. package/lib/typescript/core/OxyServices.d.ts +5 -36
  207. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  208. package/lib/typescript/core/index.d.ts +4 -0
  209. package/lib/typescript/core/index.d.ts.map +1 -1
  210. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  211. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  212. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
  213. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  214. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  215. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  216. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
  217. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
  218. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  219. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  220. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  221. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  222. package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
  223. package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
  224. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  225. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
  226. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
  227. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  228. package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
  229. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  230. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  231. package/lib/typescript/core/mixins/index.d.ts +220 -8
  232. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  233. package/lib/typescript/crypto/index.d.ts +6 -3
  234. package/lib/typescript/crypto/index.d.ts.map +1 -1
  235. package/lib/typescript/crypto/keyManager.d.ts +190 -0
  236. package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
  237. package/lib/typescript/crypto/polyfill.d.ts +4 -3
  238. package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
  239. package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
  240. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
  241. package/lib/typescript/crypto/signatureService.d.ts +87 -0
  242. package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
  243. package/lib/typescript/index.d.ts +5 -6
  244. package/lib/typescript/index.d.ts.map +1 -1
  245. package/lib/typescript/models/interfaces.d.ts +2 -14
  246. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  247. package/lib/typescript/models/session.d.ts +0 -9
  248. package/lib/typescript/models/session.d.ts.map +1 -1
  249. package/lib/typescript/types/bip39.d.ts +32 -0
  250. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
  251. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
  252. package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
  253. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  254. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
  255. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
  256. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
  257. package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
  258. package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
  259. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
  260. package/lib/typescript/ui/components/types.d.ts +4 -0
  261. package/lib/typescript/ui/components/types.d.ts.map +1 -1
  262. package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
  263. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  264. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
  265. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  266. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
  267. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
  268. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  269. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  270. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  271. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
  272. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  273. package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
  274. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  275. package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
  276. package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
  277. package/lib/typescript/ui/index.d.ts +6 -2
  278. package/lib/typescript/ui/index.d.ts.map +1 -1
  279. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  280. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  281. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  282. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
  283. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  284. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  285. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
  286. package/lib/typescript/ui/stores/authStore.d.ts +8 -7
  287. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  288. package/lib/typescript/ui/styles/spacing.d.ts +5 -0
  289. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  290. package/lib/typescript/ui/types/navigation.d.ts +2 -1
  291. package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
  292. package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
  293. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  294. package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
  295. package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
  296. package/lib/typescript/utils/errorUtils.d.ts +6 -0
  297. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  298. package/lib/typescript/utils/validationUtils.d.ts +8 -0
  299. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  300. package/package.json +8 -7
  301. package/src/core/CrossDomainAuth.ts +307 -0
  302. package/src/core/HttpService.ts +99 -16
  303. package/src/core/OxyServices.base.ts +20 -3
  304. package/src/core/OxyServices.ts +7 -3
  305. package/src/core/index.ts +9 -1
  306. package/src/core/mixins/OxyServices.assets.ts +14 -3
  307. package/src/core/mixins/OxyServices.auth.ts +105 -36
  308. package/src/core/mixins/OxyServices.fedcm.ts +315 -0
  309. package/src/core/mixins/OxyServices.popup.ts +402 -0
  310. package/src/core/mixins/OxyServices.redirect.ts +397 -0
  311. package/src/core/mixins/OxyServices.user.ts +39 -24
  312. package/src/core/mixins/index.ts +19 -3
  313. package/src/crypto/index.ts +16 -5
  314. package/src/crypto/keyManager.ts +966 -0
  315. package/src/crypto/polyfill.ts +6 -5
  316. package/src/crypto/recoveryPhrase.ts +166 -0
  317. package/src/crypto/signatureService.ts +323 -0
  318. package/src/i18n/locales/en-US.json +1 -1
  319. package/src/index.ts +19 -15
  320. package/src/models/interfaces.ts +4 -16
  321. package/src/models/session.ts +2 -11
  322. package/src/types/bip39.d.ts +32 -0
  323. package/src/ui/components/BottomSheetRouter.tsx +6 -1
  324. package/src/ui/components/Icon.tsx +1 -1
  325. package/src/ui/components/IconButton/utils.ts +1 -1
  326. package/src/ui/components/OxyProvider.tsx +44 -12
  327. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  328. package/src/ui/components/TextField/Adornment/utils.ts +2 -2
  329. package/src/ui/components/TextField/helpers.tsx +10 -10
  330. package/src/ui/components/TextField/types.tsx +1 -1
  331. package/src/ui/components/TouchableRipple/utils.ts +2 -2
  332. package/src/ui/components/Typography/AnimatedText.tsx +2 -2
  333. package/src/ui/components/types.tsx +6 -0
  334. package/src/ui/context/OxyContext.tsx +173 -195
  335. package/src/ui/context/hooks/useAuthOperations.ts +177 -36
  336. package/src/ui/context/hooks/useSessionManagement.ts +399 -0
  337. package/src/ui/hooks/mutations/useAccountMutations.ts +83 -76
  338. package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
  339. package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
  340. package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
  341. package/src/ui/hooks/useProfileEditing.ts +3 -3
  342. package/src/ui/hooks/useSessionManagement.ts +5 -10
  343. package/src/ui/hooks/useSessionSocket.ts +46 -175
  344. package/src/ui/hooks/useStorage.ts +24 -76
  345. package/src/ui/index.ts +22 -13
  346. package/src/ui/navigation/routes.ts +6 -2
  347. package/src/ui/screens/AccountCenterScreen.tsx +2 -2
  348. package/src/ui/screens/AccountOverviewScreen.tsx +1 -1
  349. package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
  350. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  351. package/src/ui/screens/OxyAuthScreen.tsx +138 -64
  352. package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
  353. package/src/ui/stores/accountStore.ts +1 -11
  354. package/src/ui/stores/authStore.ts +43 -44
  355. package/src/ui/styles/spacing.ts +15 -2
  356. package/src/ui/types/navigation.ts +2 -2
  357. package/src/ui/utils/avatarUtils.ts +39 -46
  358. package/src/ui/utils/storageHelpers.ts +0 -4
  359. package/src/utils/__tests__/validationUtils.test.ts +16 -1
  360. package/src/utils/errorUtils.ts +8 -1
  361. package/src/utils/validationUtils.ts +12 -0
  362. package/lib/commonjs/core/services/SessionService.js +0 -163
  363. package/lib/commonjs/core/services/SessionService.js.map +0 -1
  364. package/lib/commonjs/core/services/TokenService.js +0 -220
  365. package/lib/commonjs/core/services/TokenService.js.map +0 -1
  366. package/lib/commonjs/crypto/types.js +0 -2
  367. package/lib/commonjs/crypto/types.js.map +0 -1
  368. package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
  369. package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
  370. package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
  371. package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
  372. package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
  373. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
  374. package/lib/module/core/services/SessionService.js +0 -159
  375. package/lib/module/core/services/SessionService.js.map +0 -1
  376. package/lib/module/core/services/TokenService.js +0 -217
  377. package/lib/module/core/services/TokenService.js.map +0 -1
  378. package/lib/module/crypto/types.js +0 -2
  379. package/lib/module/crypto/types.js.map +0 -1
  380. package/lib/module/ui/context/OxyContextBase.js +0 -16
  381. package/lib/module/ui/context/OxyContextBase.js.map +0 -1
  382. package/lib/module/ui/context/hooks/useStorage.js +0 -74
  383. package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
  384. package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
  385. package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
  386. package/lib/typescript/core/services/SessionService.d.ts +0 -78
  387. package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
  388. package/lib/typescript/core/services/TokenService.d.ts +0 -72
  389. package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
  390. package/lib/typescript/crypto/types.d.ts +0 -22
  391. package/lib/typescript/crypto/types.d.ts.map +0 -1
  392. package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
  393. package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
  394. package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
  395. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
  396. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
  397. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
  398. package/src/core/services/SessionService.ts +0 -173
  399. package/src/core/services/TokenService.ts +0 -237
  400. package/src/crypto/types.ts +0 -23
  401. package/src/ui/context/OxyContextBase.tsx +0 -78
  402. package/src/ui/context/hooks/useStorage.ts +0 -104
  403. package/src/ui/hooks/useAvatarPicker.ts +0 -61
@@ -8,7 +8,20 @@ import { StyleSheet } from 'react-native';
8
8
  export const STEP_GAP = 12; // Vertical gap between ALL elements (illustration, title, description, textfield, buttons, etc.) - must be consistent everywhere
9
9
  export const STEP_INNER_GAP = 12; // Gap within sections (headers, cards, etc.) - must match STEP_GAP for uniformity
10
10
 
11
- // Import spacing constants directly from '../constants/spacing' where needed.
11
+ /**
12
+ * Re-export screen spacing constants from constants/spacing.ts
13
+ * This allows importing all spacing constants from a single location
14
+ */
15
+ export {
16
+ SCREEN_PADDING_HORIZONTAL,
17
+ SCREEN_PADDING_VERTICAL,
18
+ SECTION_GAP,
19
+ SECTION_GAP_LARGE,
20
+ COMPONENT_GAP,
21
+ COMPONENT_GAP_SMALL,
22
+ HEADER_PADDING_TOP_OVERVIEW,
23
+ HEADER_PADDING_TOP_SETTINGS,
24
+ } from '../constants/spacing';
12
25
 
13
26
  /**
14
27
  * Reusable stylesheet for step components
@@ -24,7 +37,7 @@ export const stepStyles = StyleSheet.create({
24
37
  },
25
38
  sectionSpacing: {
26
39
  // Layout removed - do NOT use for spacing, use explicit marginBottom: 0
27
- // This should not add margins
40
+ // This is kept for backward compatibility but should not add margins
28
41
  marginBottom: 0,
29
42
  },
30
43
  header: {
@@ -50,12 +50,12 @@ export interface BaseScreenProps {
50
50
  export interface OxyProviderProps {
51
51
  oxyServices?: unknown;
52
52
  children?: ReactNode;
53
- contextOnly?: boolean;
54
53
  onAuthStateChange?: (user: unknown) => void;
55
54
  storageKeyPrefix?: string;
56
55
  baseURL?: string;
56
+ authWebUrl?: string;
57
+ authRedirectUri?: string;
57
58
  queryClient?: QueryClient;
58
59
  }
59
60
 
60
61
 
61
-
@@ -1,9 +1,9 @@
1
1
  import type { OxyServices } from '../../core';
2
2
  import type { User } from '../../models/interfaces';
3
3
  import { useAccountStore } from '../stores/accountStore';
4
+ import { useAuthStore } from '../stores/authStore';
4
5
  import { QueryClient } from '@tanstack/react-query';
5
6
  import { queryKeys, invalidateUserQueries, invalidateAccountQueries } from '../hooks/queries/queryKeys';
6
- import { logger } from '../../utils/loggerUtils';
7
7
 
8
8
  /**
9
9
  * Updates file visibility to public for avatar use.
@@ -35,7 +35,6 @@ export async function updateAvatarVisibility(
35
35
  }
36
36
 
37
37
  /**
38
- * @deprecated Use refreshAccountInStore instead for full profile sync
39
38
  * Refreshes avatar in accountStore with cache-busted URL to force image reload.
40
39
  *
41
40
  * @param sessionId - The session ID for the account to update
@@ -55,41 +54,6 @@ export function refreshAvatarInStore(
55
54
  });
56
55
  }
57
56
 
58
- /**
59
- * Refreshes all user profile data in accountStore (username, displayName, avatar).
60
- * This ensures accountStore stays in sync with profile changes.
61
- *
62
- * @param sessionId - The session ID for the account to update
63
- * @param userData - The updated user data
64
- * @param oxyServices - OxyServices instance to generate download URL
65
- */
66
- export function refreshAccountInStore(
67
- sessionId: string,
68
- userData: Partial<User>,
69
- oxyServices: OxyServices
70
- ): void {
71
- const { updateAccount } = useAccountStore.getState();
72
-
73
- const displayName = userData.name?.full || userData.name?.first || userData.username || 'Account';
74
- const avatarUrl = userData.avatar
75
- ? oxyServices.getFileDownloadUrl(userData.avatar, 'thumb') + `?t=${Date.now()}`
76
- : undefined;
77
-
78
- logger.debug('Refreshing account in store', {
79
- component: 'AccountStore',
80
- sessionId,
81
- username: userData.username,
82
- hasAvatar: !!userData.avatar
83
- });
84
-
85
- updateAccount(sessionId, {
86
- username: userData.username,
87
- displayName,
88
- avatar: userData.avatar,
89
- avatarUrl,
90
- });
91
- }
92
-
93
57
  /**
94
58
  * Updates user profile with avatar and handles all side effects (query invalidation, accountStore update).
95
59
  * This function can be used from within OxyContext provider without requiring useOxy hook.
@@ -98,6 +62,7 @@ export function refreshAccountInStore(
98
62
  * @param oxyServices - OxyServices instance
99
63
  * @param activeSessionId - Active session ID
100
64
  * @param queryClient - TanStack Query client
65
+ * @param syncSession - Optional function to sync session/refresh token when auth errors occur
101
66
  * @returns Promise that resolves with updated user data
102
67
  */
103
68
  export async function updateProfileWithAvatar(
@@ -105,15 +70,28 @@ export async function updateProfileWithAvatar(
105
70
  oxyServices: OxyServices,
106
71
  activeSessionId: string | null,
107
72
  queryClient: QueryClient,
108
- options?: { deviceId?: string }
73
+ syncSession?: () => Promise<User>
109
74
  ): Promise<User> {
110
- const { deviceId } = options || {};
111
75
  // Ensure we have a valid token before making the request
112
76
  if (!oxyServices.hasValidToken() && activeSessionId) {
113
77
  try {
114
- await oxyServices.getTokenBySession(activeSessionId, deviceId);
78
+ await oxyServices.getTokenBySession(activeSessionId);
115
79
  } catch (tokenError) {
116
- throw tokenError;
80
+ const errorMessage = tokenError instanceof Error ? tokenError.message : String(tokenError);
81
+ if (errorMessage.includes('AUTH_REQUIRED_OFFLINE_SESSION') || errorMessage.includes('offline')) {
82
+ if (syncSession) {
83
+ try {
84
+ await syncSession();
85
+ await oxyServices.getTokenBySession(activeSessionId);
86
+ } catch (syncError) {
87
+ throw new Error('Session needs to be synced. Please try again.');
88
+ }
89
+ } else {
90
+ throw tokenError;
91
+ }
92
+ } else {
93
+ throw tokenError;
94
+ }
117
95
  }
118
96
  }
119
97
 
@@ -126,9 +104,12 @@ export async function updateProfileWithAvatar(
126
104
  queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);
127
105
  }
128
106
 
129
- // Refresh accountStore with all updated profile data
130
- if (activeSessionId) {
131
- refreshAccountInStore(activeSessionId, data, oxyServices);
107
+ // Update authStore so frontend components see the changes immediately
108
+ useAuthStore.getState().setUser(data);
109
+
110
+ // If avatar was updated, refresh accountStore with cache-busted URL
111
+ if (updates.avatar && activeSessionId) {
112
+ refreshAvatarInStore(activeSessionId, updates.avatar, oxyServices);
132
113
  }
133
114
 
134
115
  // Invalidate all related queries to refresh everywhere
@@ -141,10 +122,22 @@ export async function updateProfileWithAvatar(
141
122
  const status = error?.status || error?.response?.status;
142
123
 
143
124
  // Handle authentication errors
144
- if (status === 401 || errorMessage.includes('Authentication required') || errorMessage.includes('Invalid or missing authorization header')) {
145
- throw new Error('Authentication failed. Please sign in again.');
125
+ if (status === 401 || errorMessage.includes('Authentication required') || errorMessage.includes('Invalid or missing authorization header')) {
126
+ if (activeSessionId && syncSession) {
127
+ try {
128
+ await syncSession();
129
+ await oxyServices.getTokenBySession(activeSessionId);
130
+ // Retry the update after getting token
131
+ return await updateProfileWithAvatar(updates, oxyServices, activeSessionId, queryClient, syncSession);
132
+ } catch (retryError) {
133
+ throw new Error('Authentication failed. Please sign in again.');
134
+ }
135
+ } else {
136
+ throw new Error('No active session. Please sign in.');
137
+ }
146
138
  }
147
139
 
148
140
  throw error;
149
141
  }
150
142
  }
143
+
@@ -11,10 +11,6 @@ export interface SessionStorageKeys {
11
11
  language: string;
12
12
  }
13
13
 
14
- export interface CreateStorageOptions {
15
- prefix?: string;
16
- }
17
-
18
14
  /**
19
15
  * Create an in-memory storage implementation used as a safe fallback.
20
16
  */
@@ -6,6 +6,7 @@ import {
6
6
  isValidObject,
7
7
  isValidEmail,
8
8
  isValidUsername,
9
+ isValidPassword,
9
10
  isValidUUID,
10
11
  isValidDate,
11
12
  isValidFileSize,
@@ -124,6 +125,20 @@ describe('Validation Utils', () => {
124
125
  });
125
126
  });
126
127
 
128
+ describe('isValidPassword', () => {
129
+ it('should return true for valid passwords', () => {
130
+ expect(isValidPassword('password123')).toBe(true);
131
+ expect(isValidPassword('mySecurePass')).toBe(true);
132
+ expect(isValidPassword('12345678')).toBe(true);
133
+ });
134
+
135
+ it('should return false for invalid passwords', () => {
136
+ expect(isValidPassword('')).toBe(false);
137
+ expect(isValidPassword('short')).toBe(false); // too short
138
+ expect(isValidPassword('1234567')).toBe(false); // too short
139
+ });
140
+ });
141
+
127
142
  describe('isValidUUID', () => {
128
143
  it('should return true for valid UUIDs', () => {
129
144
  expect(isValidUUID('123e4567-e89b-12d3-a456-426614174000')).toBe(true);
@@ -218,4 +233,4 @@ describe('Validation Utils', () => {
218
233
  expect(validateAndSanitizeUserInput(123, 'string')).toBeNull();
219
234
  });
220
235
  });
221
- });
236
+ });
@@ -211,4 +211,11 @@ export function logError(error: unknown, context?: string): void {
211
211
  method: 'logError',
212
212
  });
213
213
  }
214
- }
214
+ }
215
+
216
+ /**
217
+ * Retry function with exponential backoff
218
+ * Re-exports retryAsync for backward compatibility
219
+ * @deprecated Use retryAsync from asyncUtils instead
220
+ */
221
+ export { retryAsync as retryWithBackoff } from './asyncUtils';
@@ -12,6 +12,11 @@ export const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
12
12
  */
13
13
  export const USERNAME_REGEX = /^[a-zA-Z0-9_-]{3,30}$/;
14
14
 
15
+ /**
16
+ * Password validation regex (at least 8 chars, 1 uppercase, 1 lowercase, 1 number)
17
+ */
18
+ // At least 8 characters (tests expect len>=8 without complexity requirements)
19
+ export const PASSWORD_REGEX = /^.{8,}$/;
15
20
 
16
21
  /**
17
22
  * Validate email format
@@ -27,6 +32,13 @@ export function isValidUsername(username: string): boolean {
27
32
  return USERNAME_REGEX.test(username);
28
33
  }
29
34
 
35
+ /**
36
+ * Validate password strength
37
+ */
38
+ export function isValidPassword(password: string): boolean {
39
+ return PASSWORD_REGEX.test(password);
40
+ }
41
+
30
42
  /**
31
43
  * Validate required string
32
44
  */
@@ -1,163 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.sessionService = void 0;
7
- var _TokenService = require("./TokenService");
8
- /**
9
- * SessionService - Single Source of Truth for Session Management
10
- *
11
- * Handles all session operations: creation, validation, refresh, invalidation.
12
- * Manages active session state and provides session data to other services.
13
- *
14
- * Architecture:
15
- * - Single source of truth for session operations
16
- * - Handles both online and offline sessions
17
- * - Integrates with TokenService for token management
18
- * - userId is always MongoDB ObjectId, never publicKey
19
- */
20
-
21
- /**
22
- * SessionService - Singleton pattern for global session management
23
- */
24
- class SessionService {
25
- oxyServices = null;
26
- activeSession = null;
27
- sessions = [];
28
- constructor() {}
29
- static getInstance() {
30
- if (!SessionService.instance) {
31
- SessionService.instance = new SessionService();
32
- }
33
- return SessionService.instance;
34
- }
35
-
36
- /**
37
- * Initialize SessionService with OxyServices instance
38
- */
39
- initialize(oxyServices) {
40
- this.oxyServices = oxyServices;
41
- }
42
-
43
- /**
44
- * Get active session
45
- */
46
- getActiveSession() {
47
- return this.activeSession;
48
- }
49
-
50
- /**
51
- * Get all sessions
52
- */
53
- getAllSessions() {
54
- return [...this.sessions];
55
- }
56
-
57
- /**
58
- * Create a new session (sign in)
59
- * @param publicKey - User's public key for authentication
60
- * @returns User object and session data
61
- */
62
- async createSession(publicKey) {
63
- if (!this.oxyServices) {
64
- throw new Error('SessionService not initialized with OxyServices');
65
- }
66
-
67
- // This will be implemented by delegating to existing sign-in logic
68
- // For now, this is a placeholder that shows the interface
69
- throw new Error('SessionService.createSession not yet implemented - use existing signIn flow');
70
- }
71
-
72
- /**
73
- * Refresh current session
74
- */
75
- async refreshSession() {
76
- if (!this.activeSession) {
77
- throw new Error('No active session to refresh');
78
- }
79
-
80
- // Refresh token first
81
- await _TokenService.tokenService.refreshTokenIfNeeded();
82
-
83
- // Then refresh session data from server
84
- // Implementation will be added
85
- return this.activeSession;
86
- }
87
-
88
- /**
89
- * Validate current session
90
- */
91
- async validateSession() {
92
- if (!this.activeSession) {
93
- return false;
94
- }
95
-
96
- // Check if session expired
97
- if (new Date(this.activeSession.expiresAt) < new Date()) {
98
- return false;
99
- }
100
-
101
- // Check if token is valid
102
- const token = _TokenService.tokenService.getAccessToken();
103
- if (!token) {
104
- return false;
105
- }
106
-
107
- // Additional validation can be added here
108
- return true;
109
- }
110
-
111
- /**
112
- * Invalidate current session (sign out)
113
- */
114
- async invalidateSession() {
115
- if (!this.activeSession || !this.oxyServices) {
116
- return;
117
- }
118
- try {
119
- // Call API to invalidate session on server
120
- await this.oxyServices.makeRequest('POST', `/api/session/${this.activeSession.sessionId}/logout`, undefined, {
121
- cache: false
122
- });
123
- } catch (error) {
124
- // Continue with local cleanup even if API call fails
125
- console.warn('Failed to invalidate session on server:', error);
126
- }
127
-
128
- // Clear tokens
129
- _TokenService.tokenService.clearTokens();
130
-
131
- // Clear active session
132
- this.activeSession = null;
133
- this.sessions = this.sessions.filter(s => s.sessionId !== this.activeSession?.sessionId);
134
- }
135
-
136
- /**
137
- * Set active session (internal use)
138
- */
139
- setActiveSession(session) {
140
- this.activeSession = session;
141
-
142
- // Update sessions list
143
- const existingIndex = this.sessions.findIndex(s => s.sessionId === session.sessionId);
144
- if (existingIndex >= 0) {
145
- this.sessions[existingIndex] = session;
146
- } else {
147
- this.sessions.push(session);
148
- }
149
- }
150
-
151
- /**
152
- * Clear all sessions (logout all)
153
- */
154
- clearAllSessions() {
155
- this.activeSession = null;
156
- this.sessions = [];
157
- _TokenService.tokenService.clearTokens();
158
- }
159
- }
160
-
161
- // Export singleton instance
162
- const sessionService = exports.sessionService = SessionService.getInstance();
163
- //# sourceMappingURL=SessionService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_TokenService","require","SessionService","oxyServices","activeSession","sessions","constructor","getInstance","instance","initialize","getActiveSession","getAllSessions","createSession","publicKey","Error","refreshSession","tokenService","refreshTokenIfNeeded","validateSession","Date","expiresAt","token","getAccessToken","invalidateSession","makeRequest","sessionId","undefined","cache","error","console","warn","clearTokens","filter","s","setActiveSession","session","existingIndex","findIndex","push","clearAllSessions","sessionService","exports"],"sourceRoot":"../../../../src","sources":["core/services/SessionService.ts"],"mappings":"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","ignoreList":[]}
@@ -1,220 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.tokenService = void 0;
7
- var _jwtDecode = require("jwt-decode");
8
- /**
9
- * TokenService - Single Source of Truth for Token Management
10
- *
11
- * Handles all token storage, retrieval, refresh, and validation.
12
- * Used by HttpService, SocketService, and other services that need tokens.
13
- *
14
- * Architecture:
15
- * - Single storage location (no duplication)
16
- * - Automatic token refresh when expiring soon
17
- * - Type-safe token payload handling
18
- * - userId is always MongoDB ObjectId, never publicKey
19
- */
20
-
21
- /**
22
- * AccessTokenPayload - Matches the token payload structure from API
23
- * userId is always MongoDB ObjectId (24 hex characters), never publicKey
24
- */
25
-
26
- /**
27
- * TokenService - Singleton pattern for global token management
28
- */
29
- class TokenService {
30
- tokenStore = {
31
- accessToken: null,
32
- refreshToken: null
33
- };
34
- refreshPromise = null;
35
- baseURL = null;
36
- constructor() {}
37
- static getInstance() {
38
- if (!TokenService.instance) {
39
- TokenService.instance = new TokenService();
40
- }
41
- return TokenService.instance;
42
- }
43
-
44
- /**
45
- * Initialize TokenService with base URL for refresh requests
46
- */
47
- initialize(baseURL) {
48
- this.baseURL = baseURL;
49
- }
50
-
51
- /**
52
- * Get current access token
53
- */
54
- getAccessToken() {
55
- return this.tokenStore.accessToken;
56
- }
57
-
58
- /**
59
- * Get current refresh token
60
- */
61
- getRefreshToken() {
62
- return this.tokenStore.refreshToken;
63
- }
64
-
65
- /**
66
- * Set tokens (called after login or token refresh)
67
- */
68
- setTokens(accessToken, refreshToken = '') {
69
- this.tokenStore.accessToken = accessToken;
70
- this.tokenStore.refreshToken = refreshToken || this.tokenStore.refreshToken;
71
- }
72
-
73
- /**
74
- * Clear all tokens (called on logout)
75
- */
76
- clearTokens() {
77
- this.tokenStore.accessToken = null;
78
- this.tokenStore.refreshToken = null;
79
- this.refreshPromise = null;
80
- }
81
-
82
- /**
83
- * Check if access token exists
84
- */
85
- hasAccessToken() {
86
- return !!this.tokenStore.accessToken;
87
- }
88
-
89
- /**
90
- * Check if token is expiring soon (within 60 seconds)
91
- */
92
- isTokenExpiringSoon() {
93
- const token = this.tokenStore.accessToken;
94
- if (!token) return false;
95
- try {
96
- const decoded = (0, _jwtDecode.jwtDecode)(token);
97
- if (!decoded.exp) return false;
98
- const currentTime = Math.floor(Date.now() / 1000);
99
- return decoded.exp - currentTime < 60; // Expiring within 60 seconds
100
- } catch {
101
- return false;
102
- }
103
- }
104
-
105
- /**
106
- * Get userId from current access token
107
- * Returns MongoDB ObjectId (never publicKey)
108
- */
109
- getUserIdFromToken() {
110
- const token = this.tokenStore.accessToken;
111
- if (!token) return null;
112
- try {
113
- const decoded = (0, _jwtDecode.jwtDecode)(token);
114
- return decoded.userId || null;
115
- } catch {
116
- return null;
117
- }
118
- }
119
-
120
- /**
121
- * Refresh access token if expiring soon
122
- * Returns promise that resolves when token is refreshed (or already valid)
123
- */
124
- async refreshTokenIfNeeded() {
125
- // If already refreshing, wait for that promise
126
- if (this.refreshPromise) {
127
- return this.refreshPromise;
128
- }
129
- const hasToken = !!this.tokenStore.accessToken;
130
- const needsRefresh = this.isTokenExpiringSoon();
131
-
132
- // If no access token but we have refresh token, attempt refresh once
133
- if (!hasToken && this.tokenStore.refreshToken) {
134
- this.refreshPromise = this._performRefresh();
135
- try {
136
- await this.refreshPromise;
137
- } finally {
138
- this.refreshPromise = null;
139
- }
140
- return;
141
- }
142
-
143
- // If token not expiring soon, no refresh needed
144
- if (!needsRefresh) {
145
- return;
146
- }
147
-
148
- // Start refresh
149
- this.refreshPromise = this._performRefresh();
150
- try {
151
- await this.refreshPromise;
152
- } finally {
153
- this.refreshPromise = null;
154
- }
155
- }
156
-
157
- /**
158
- * Perform token refresh
159
- */
160
- async _performRefresh() {
161
- const refreshToken = this.tokenStore.refreshToken;
162
- if (!refreshToken) {
163
- throw new Error('No refresh token to refresh');
164
- }
165
- try {
166
- if (!this.baseURL) {
167
- throw new Error('TokenService not initialized with baseURL');
168
- }
169
- const refreshUrl = `${this.baseURL}/api/auth/refresh`;
170
- const response = await fetch(refreshUrl, {
171
- method: 'POST',
172
- headers: {
173
- 'Accept': 'application/json',
174
- 'Content-Type': 'application/json'
175
- },
176
- body: JSON.stringify({
177
- refreshToken
178
- }),
179
- signal: AbortSignal.timeout(5000)
180
- });
181
- if (!response.ok) {
182
- throw new Error(`Token refresh failed: ${response.status}`);
183
- }
184
- const {
185
- accessToken: newToken,
186
- refreshToken: newRefresh
187
- } = await response.json();
188
- if (!newToken) {
189
- throw new Error('No access token in refresh response');
190
- }
191
-
192
- // Validate new token has correct userId format (ObjectId)
193
- const newDecoded = (0, _jwtDecode.jwtDecode)(newToken);
194
- if (newDecoded.userId && !/^[0-9a-fA-F]{24}$/.test(newDecoded.userId)) {
195
- throw new Error(`Invalid userId format in refreshed token: ${newDecoded.userId.substring(0, 20)}...`);
196
- }
197
- this.setTokens(newToken, newRefresh || refreshToken);
198
- } catch (error) {
199
- // Clear tokens on refresh failure (likely expired or invalid)
200
- this.clearTokens();
201
- throw error;
202
- }
203
- }
204
-
205
- /**
206
- * Get authorization header with automatic refresh
207
- */
208
- async getAuthHeader() {
209
- // Refresh if needed
210
- await this.refreshTokenIfNeeded().catch(() => {
211
- // Ignore refresh errors, will use current token or return null
212
- });
213
- const token = this.tokenStore.accessToken;
214
- return token ? `Bearer ${token}` : null;
215
- }
216
- }
217
-
218
- // Export singleton instance
219
- const tokenService = exports.tokenService = TokenService.getInstance();
220
- //# sourceMappingURL=TokenService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_jwtDecode","require","TokenService","tokenStore","accessToken","refreshToken","refreshPromise","baseURL","constructor","getInstance","instance","initialize","getAccessToken","getRefreshToken","setTokens","clearTokens","hasAccessToken","isTokenExpiringSoon","token","decoded","jwtDecode","exp","currentTime","Math","floor","Date","now","getUserIdFromToken","userId","refreshTokenIfNeeded","hasToken","needsRefresh","_performRefresh","Error","refreshUrl","response","fetch","method","headers","body","JSON","stringify","signal","AbortSignal","timeout","ok","status","newToken","newRefresh","json","newDecoded","test","substring","error","getAuthHeader","catch","tokenService","exports"],"sourceRoot":"../../../../src","sources":["core/services/TokenService.ts"],"mappings":";;;;;;AAaA,IAAAA,UAAA,GAAAC,OAAA;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;;AAeA;AACA;AACA;AACA,MAAMC,YAAY,CAAC;EAETC,UAAU,GAAe;IAC/BC,WAAW,EAAE,IAAI;IACjBC,YAAY,EAAE;EAChB,CAAC;EACOC,cAAc,GAAyB,IAAI;EAC3CC,OAAO,GAAkB,IAAI;EAE7BC,WAAWA,CAAA,EAAG,CAAC;EAEvB,OAAOC,WAAWA,CAAA,EAAiB;IACjC,IAAI,CAACP,YAAY,CAACQ,QAAQ,EAAE;MAC1BR,YAAY,CAACQ,QAAQ,GAAG,IAAIR,YAAY,CAAC,CAAC;IAC5C;IACA,OAAOA,YAAY,CAACQ,QAAQ;EAC9B;;EAEA;AACF;AACA;EACEC,UAAUA,CAACJ,OAAe,EAAQ;IAChC,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;;EAEA;AACF;AACA;EACEK,cAAcA,CAAA,EAAkB;IAC9B,OAAO,IAAI,CAACT,UAAU,CAACC,WAAW;EACpC;;EAEA;AACF;AACA;EACES,eAAeA,CAAA,EAAkB;IAC/B,OAAO,IAAI,CAACV,UAAU,CAACE,YAAY;EACrC;;EAEA;AACF;AACA;EACES,SAASA,CAACV,WAAmB,EAAEC,YAAoB,GAAG,EAAE,EAAQ;IAC9D,IAAI,CAACF,UAAU,CAACC,WAAW,GAAGA,WAAW;IACzC,IAAI,CAACD,UAAU,CAACE,YAAY,GAAGA,YAAY,IAAI,IAAI,CAACF,UAAU,CAACE,YAAY;EAC7E;;EAEA;AACF;AACA;EACEU,WAAWA,CAAA,EAAS;IAClB,IAAI,CAACZ,UAAU,CAACC,WAAW,GAAG,IAAI;IAClC,IAAI,CAACD,UAAU,CAACE,YAAY,GAAG,IAAI;IACnC,IAAI,CAACC,cAAc,GAAG,IAAI;EAC5B;;EAEA;AACF;AACA;EACEU,cAAcA,CAAA,EAAY;IACxB,OAAO,CAAC,CAAC,IAAI,CAACb,UAAU,CAACC,WAAW;EACtC;;EAEA;AACF;AACA;EACEa,mBAAmBA,CAAA,EAAY;IAC7B,MAAMC,KAAK,GAAG,IAAI,CAACf,UAAU,CAACC,WAAW;IACzC,IAAI,CAACc,KAAK,EAAE,OAAO,KAAK;IAExB,IAAI;MACF,MAAMC,OAAO,GAAG,IAAAC,oBAAS,EAAqBF,KAAK,CAAC;MACpD,IAAI,CAACC,OAAO,CAACE,GAAG,EAAE,OAAO,KAAK;MAE9B,MAAMC,WAAW,GAAGC,IAAI,CAACC,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;MACjD,OAAOP,OAAO,CAACE,GAAG,GAAGC,WAAW,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,MAAM;MACN,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;AACA;EACEK,kBAAkBA,CAAA,EAAkB;IAClC,MAAMT,KAAK,GAAG,IAAI,CAACf,UAAU,CAACC,WAAW;IACzC,IAAI,CAACc,KAAK,EAAE,OAAO,IAAI;IAEvB,IAAI;MACF,MAAMC,OAAO,GAAG,IAAAC,oBAAS,EAAqBF,KAAK,CAAC;MACpD,OAAOC,OAAO,CAACS,MAAM,IAAI,IAAI;IAC/B,CAAC,CAAC,MAAM;MACN,OAAO,IAAI;IACb;EACF;;EAEA;AACF;AACA;AACA;EACE,MAAMC,oBAAoBA,CAAA,EAAkB;IAC1C;IACA,IAAI,IAAI,CAACvB,cAAc,EAAE;MACvB,OAAO,IAAI,CAACA,cAAc;IAC5B;IAEA,MAAMwB,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC3B,UAAU,CAACC,WAAW;IAC9C,MAAM2B,YAAY,GAAG,IAAI,CAACd,mBAAmB,CAAC,CAAC;;IAE/C;IACA,IAAI,CAACa,QAAQ,IAAI,IAAI,CAAC3B,UAAU,CAACE,YAAY,EAAE;MAC7C,IAAI,CAACC,cAAc,GAAG,IAAI,CAAC0B,eAAe,CAAC,CAAC;MAC5C,IAAI;QACF,MAAM,IAAI,CAAC1B,cAAc;MAC3B,CAAC,SAAS;QACR,IAAI,CAACA,cAAc,GAAG,IAAI;MAC5B;MACA;IACF;;IAEA;IACA,IAAI,CAACyB,YAAY,EAAE;MACjB;IACF;;IAEA;IACA,IAAI,CAACzB,cAAc,GAAG,IAAI,CAAC0B,eAAe,CAAC,CAAC;IAE5C,IAAI;MACF,MAAM,IAAI,CAAC1B,cAAc;IAC3B,CAAC,SAAS;MACR,IAAI,CAACA,cAAc,GAAG,IAAI;IAC5B;EACF;;EAEA;AACF;AACA;EACE,MAAc0B,eAAeA,CAAA,EAAkB;IAC7C,MAAM3B,YAAY,GAAG,IAAI,CAACF,UAAU,CAACE,YAAY;IACjD,IAAI,CAACA,YAAY,EAAE;MACjB,MAAM,IAAI4B,KAAK,CAAC,6BAA6B,CAAC;IAChD;IAEA,IAAI;MACF,IAAI,CAAC,IAAI,CAAC1B,OAAO,EAAE;QACjB,MAAM,IAAI0B,KAAK,CAAC,2CAA2C,CAAC;MAC9D;MAEA,MAAMC,UAAU,GAAG,GAAG,IAAI,CAAC3B,OAAO,mBAAmB;MACrD,MAAM4B,QAAQ,GAAG,MAAMC,KAAK,CAACF,UAAU,EAAE;QACvCG,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,QAAQ,EAAE,kBAAkB;UAC5B,cAAc,EAAE;QAClB,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UAAEpC;QAAa,CAAC,CAAC;QACtCqC,MAAM,EAAEC,WAAW,CAACC,OAAO,CAAC,IAAI;MAClC,CAAC,CAAC;MAEF,IAAI,CAACT,QAAQ,CAACU,EAAE,EAAE;QAChB,MAAM,IAAIZ,KAAK,CAAC,yBAAyBE,QAAQ,CAACW,MAAM,EAAE,CAAC;MAC7D;MAEA,MAAM;QAAE1C,WAAW,EAAE2C,QAAQ;QAAE1C,YAAY,EAAE2C;MAAW,CAAC,GAAG,MAAMb,QAAQ,CAACc,IAAI,CAAC,CAAC;MAEjF,IAAI,CAACF,QAAQ,EAAE;QACb,MAAM,IAAId,KAAK,CAAC,qCAAqC,CAAC;MACxD;;MAEA;MACA,MAAMiB,UAAU,GAAG,IAAA9B,oBAAS,EAAqB2B,QAAQ,CAAC;MAC1D,IAAIG,UAAU,CAACtB,MAAM,IAAI,CAAC,mBAAmB,CAACuB,IAAI,CAACD,UAAU,CAACtB,MAAM,CAAC,EAAE;QACrE,MAAM,IAAIK,KAAK,CAAC,6CAA6CiB,UAAU,CAACtB,MAAM,CAACwB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;MACvG;MAEA,IAAI,CAACtC,SAAS,CAACiC,QAAQ,EAAEC,UAAU,IAAI3C,YAAY,CAAC;IACtD,CAAC,CAAC,OAAOgD,KAAK,EAAE;MACd;MACA,IAAI,CAACtC,WAAW,CAAC,CAAC;MAClB,MAAMsC,KAAK;IACb;EACF;;EAEA;AACF;AACA;EACE,MAAMC,aAAaA,CAAA,EAA2B;IAC5C;IACA,MAAM,IAAI,CAACzB,oBAAoB,CAAC,CAAC,CAAC0B,KAAK,CAAC,MAAM;MAC5C;IAAA,CACD,CAAC;IAEF,MAAMrC,KAAK,GAAG,IAAI,CAACf,UAAU,CAACC,WAAW;IACzC,OAAOc,KAAK,GAAG,UAAUA,KAAK,EAAE,GAAG,IAAI;EACzC;AACF;;AAEA;AACO,MAAMsC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAGtD,YAAY,CAACO,WAAW,CAAC,CAAC","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../src","sources":["crypto/types.ts"],"mappings":"","ignoreList":[]}