@stytch/react 20.0.0-next.5 → 20.0.0-next.6

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 (312) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/StytchSSRProxy-Bz6LNYdq.js.map +1 -1
  3. package/dist/cjs/adminPortal/index.cjs +2 -2
  4. package/dist/cjs/b2b/index.cjs +10 -7
  5. package/dist/cjs/b2b/index.cjs.map +1 -1
  6. package/dist/cjs/b2b/index.headless.cjs +456 -496
  7. package/dist/cjs/b2b/index.headless.cjs.map +1 -1
  8. package/dist/cjs/{idpHelpers-Bj_7pbfW.js → idpHelpers-UZaYQqT8.js} +111 -129
  9. package/dist/cjs/{idpHelpers-Bj_7pbfW.js.map → idpHelpers-UZaYQqT8.js.map} +1 -1
  10. package/dist/cjs/{index-BIjXBvf_.js → index-MDH3lelI.js} +2 -2
  11. package/dist/cjs/{index-BIjXBvf_.js.map → index-MDH3lelI.js.map} +1 -1
  12. package/dist/cjs/index.cjs +18 -14
  13. package/dist/cjs/index.cjs.map +1 -1
  14. package/dist/cjs/index.headless.cjs +401 -448
  15. package/dist/cjs/index.headless.cjs.map +1 -1
  16. package/dist/cjs/{passwordManagerDisableAutofillProps-DV31RTL_.js → passwordManagerDisableAutofillProps-BzR1GTDj.js} +42 -33
  17. package/dist/cjs/passwordManagerDisableAutofillProps-BzR1GTDj.js.map +1 -0
  18. package/dist/cjs/{shadcn-aVU6Lm9q.js → shadcn-BNtf3uZr.js} +7 -6
  19. package/dist/cjs/shadcn-BNtf3uZr.js.map +1 -0
  20. package/dist/cjs-dev/adminPortal/index.cjs +2 -2
  21. package/dist/cjs-dev/b2b/index.cjs +10 -7
  22. package/dist/cjs-dev/b2b/index.cjs.map +1 -1
  23. package/dist/cjs-dev/b2b/index.headless.cjs +468 -508
  24. package/dist/cjs-dev/b2b/index.headless.cjs.map +1 -1
  25. package/dist/cjs-dev/dev-DaCGDI6V.js.map +1 -1
  26. package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js → idpHelpers-CVk39K69.js} +111 -129
  27. package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js.map → idpHelpers-CVk39K69.js.map} +1 -1
  28. package/dist/cjs-dev/{index-rquGmIlv.js → index-BDTK8QN0.js} +2 -2
  29. package/dist/cjs-dev/{index-rquGmIlv.js.map → index-BDTK8QN0.js.map} +1 -1
  30. package/dist/cjs-dev/index.cjs +18 -14
  31. package/dist/cjs-dev/index.cjs.map +1 -1
  32. package/dist/cjs-dev/index.headless.cjs +405 -452
  33. package/dist/cjs-dev/index.headless.cjs.map +1 -1
  34. package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CgiK2M_U.js → passwordManagerDisableAutofillProps--FLcEDiY.js} +42 -33
  35. package/dist/cjs-dev/passwordManagerDisableAutofillProps--FLcEDiY.js.map +1 -0
  36. package/dist/cjs-dev/{shadcn-DMk6ZSoD.js → shadcn-CvmoCuzj.js} +9 -8
  37. package/dist/cjs-dev/shadcn-CvmoCuzj.js.map +1 -0
  38. package/dist/esm/_virtual/index3.mjs +3 -5
  39. package/dist/esm/_virtual/index3.mjs.map +1 -1
  40. package/dist/esm/_virtual/index4.mjs +5 -3
  41. package/dist/esm/_virtual/index4.mjs.map +1 -1
  42. package/dist/esm/node_modules/@lingui/react/dist/index.mjs +14 -13
  43. package/dist/esm/node_modules/@lingui/react/dist/index.mjs.map +1 -1
  44. package/dist/esm/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
  45. package/dist/esm/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
  46. package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
  47. package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
  48. package/dist/esm/packages/core/src/EventLogger.mjs.map +1 -1
  49. package/dist/esm/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
  50. package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
  51. package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
  52. package/dist/esm/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
  53. package/dist/esm/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
  54. package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
  55. package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
  56. package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
  57. package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
  58. package/dist/esm/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
  59. package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
  60. package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
  61. package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
  62. package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
  63. package/dist/esm/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
  64. package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +111 -125
  65. package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
  66. package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
  67. package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
  68. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
  69. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
  70. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
  71. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
  72. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
  73. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
  74. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
  75. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +142 -153
  76. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
  77. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
  78. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
  79. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
  80. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
  81. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
  82. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
  83. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
  84. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +81 -93
  85. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
  86. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +67 -73
  87. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
  88. package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
  89. package/dist/esm/packages/core/src/NetworkClient.mjs.map +1 -1
  90. package/dist/esm/packages/core/src/SearchManager.mjs.map +1 -1
  91. package/dist/esm/packages/core/src/SessionManager.mjs +28 -31
  92. package/dist/esm/packages/core/src/SessionManager.mjs.map +1 -1
  93. package/dist/esm/packages/core/src/StateChangeClient.mjs +5 -6
  94. package/dist/esm/packages/core/src/StateChangeClient.mjs.map +1 -1
  95. package/dist/esm/packages/core/src/public/SDKErrors.mjs.map +1 -1
  96. package/dist/esm/packages/core/src/rbac.mjs.map +1 -1
  97. package/dist/esm/packages/core/src/rpc/FrameClient.mjs.map +1 -1
  98. package/dist/esm/packages/web/src/BootstrapDataManager.mjs.map +1 -1
  99. package/dist/esm/packages/web/src/CaptchaProvider.mjs +10 -11
  100. package/dist/esm/packages/web/src/CaptchaProvider.mjs.map +1 -1
  101. package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs +4 -8
  102. package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
  103. package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs +24 -24
  104. package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
  105. package/dist/esm/packages/web/src/NetworkClient.mjs +4 -5
  106. package/dist/esm/packages/web/src/NetworkClient.mjs.map +1 -1
  107. package/dist/esm/packages/web/src/PKCEManager.mjs.map +1 -1
  108. package/dist/esm/packages/web/src/StytchClient.mjs.map +1 -1
  109. package/dist/esm/packages/web/src/SubscriptionService.mjs +8 -10
  110. package/dist/esm/packages/web/src/SubscriptionService.mjs.map +1 -1
  111. package/dist/esm/packages/web/src/adminPortal/utils/theme.mjs +1 -1
  112. package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
  113. package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
  114. package/dist/esm/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
  115. package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
  116. package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
  117. package/dist/esm/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
  118. package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
  119. package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
  120. package/dist/esm/packages/web/src/ui/b2b/App.mjs +3 -1
  121. package/dist/esm/packages/web/src/ui/b2b/App.mjs.map +1 -1
  122. package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
  123. package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
  124. package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
  125. package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
  126. package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
  127. package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
  128. package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
  129. package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
  130. package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
  131. package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
  132. package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
  133. package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +4 -2
  134. package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
  135. package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
  136. package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
  137. package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
  138. package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
  139. package/dist/esm/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
  140. package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
  141. package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
  142. package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
  143. package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
  144. package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
  145. package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
  146. package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
  147. package/dist/esm/packages/web/src/utils/crypto.mjs +1 -1
  148. package/dist/esm-dev/_virtual/index.mjs +3 -5
  149. package/dist/esm-dev/_virtual/index.mjs.map +1 -1
  150. package/dist/esm-dev/_virtual/index2.mjs +5 -3
  151. package/dist/esm-dev/_virtual/index2.mjs.map +1 -1
  152. package/dist/esm-dev/_virtual/index3.mjs +5 -3
  153. package/dist/esm-dev/_virtual/index3.mjs.map +1 -1
  154. package/dist/esm-dev/_virtual/index4.mjs +3 -5
  155. package/dist/esm-dev/_virtual/index4.mjs.map +1 -1
  156. package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs +14 -13
  157. package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs.map +1 -1
  158. package/dist/esm-dev/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
  159. package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
  160. package/dist/esm-dev/node_modules/swr/core/dist/index.mjs +1 -1
  161. package/dist/esm-dev/node_modules/swr/infinite/dist/index.mjs +1 -1
  162. package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
  163. package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
  164. package/dist/esm-dev/packages/core/src/EventLogger.mjs.map +1 -1
  165. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
  166. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
  167. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
  168. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
  169. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
  170. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
  171. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
  172. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
  173. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
  174. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
  175. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
  176. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
  177. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
  178. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
  179. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
  180. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +114 -128
  181. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
  182. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
  183. package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
  184. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
  185. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
  186. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
  187. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
  188. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
  189. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
  190. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
  191. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +144 -155
  192. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
  193. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
  194. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
  195. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
  196. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
  197. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
  198. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
  199. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
  200. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +88 -100
  201. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
  202. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +70 -76
  203. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
  204. package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
  205. package/dist/esm-dev/packages/core/src/NetworkClient.mjs.map +1 -1
  206. package/dist/esm-dev/packages/core/src/SearchManager.mjs.map +1 -1
  207. package/dist/esm-dev/packages/core/src/SessionManager.mjs +28 -31
  208. package/dist/esm-dev/packages/core/src/SessionManager.mjs.map +1 -1
  209. package/dist/esm-dev/packages/core/src/StateChangeClient.mjs +5 -6
  210. package/dist/esm-dev/packages/core/src/StateChangeClient.mjs.map +1 -1
  211. package/dist/esm-dev/packages/core/src/public/SDKErrors.mjs.map +1 -1
  212. package/dist/esm-dev/packages/core/src/rbac.mjs.map +1 -1
  213. package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs.map +1 -1
  214. package/dist/esm-dev/packages/web/src/BootstrapDataManager.mjs.map +1 -1
  215. package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs +10 -11
  216. package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs.map +1 -1
  217. package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs +4 -8
  218. package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
  219. package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs +24 -24
  220. package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
  221. package/dist/esm-dev/packages/web/src/NetworkClient.mjs +4 -5
  222. package/dist/esm-dev/packages/web/src/NetworkClient.mjs.map +1 -1
  223. package/dist/esm-dev/packages/web/src/PKCEManager.mjs.map +1 -1
  224. package/dist/esm-dev/packages/web/src/StytchClient.mjs.map +1 -1
  225. package/dist/esm-dev/packages/web/src/SubscriptionService.mjs +8 -10
  226. package/dist/esm-dev/packages/web/src/SubscriptionService.mjs.map +1 -1
  227. package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AuthManagementSection.mjs +1 -1
  228. package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/useMemberActivation.mjs +1 -1
  229. package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionDangerZoneSection.mjs +1 -1
  230. package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionTokenRotationSection.mjs +1 -1
  231. package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMNewConnectionScreen.mjs +1 -1
  232. package/dist/esm-dev/packages/web/src/adminPortal/sso/SSONewConnectionScreen.mjs +1 -1
  233. package/dist/esm-dev/packages/web/src/adminPortal/utils/theme.mjs +1 -1
  234. package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateMember.mjs +1 -1
  235. package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateOrganization.mjs +1 -1
  236. package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateScimConnection.mjs +1 -1
  237. package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateSsoConnection.mjs +1 -1
  238. package/dist/esm-dev/packages/web/src/adminPortal/utils/useRevalidateConnectionList.mjs +1 -1
  239. package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
  240. package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
  241. package/dist/esm-dev/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
  242. package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
  243. package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
  244. package/dist/esm-dev/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
  245. package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
  246. package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
  247. package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs +3 -1
  248. package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs.map +1 -1
  249. package/dist/esm-dev/packages/web/src/ui/b2b/Container.mjs +1 -1
  250. package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
  251. package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
  252. package/dist/esm-dev/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
  253. package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
  254. package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
  255. package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
  256. package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
  257. package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
  258. package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
  259. package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
  260. package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
  261. package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
  262. package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +5 -3
  263. package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
  264. package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
  265. package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
  266. package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
  267. package/dist/esm-dev/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
  268. package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
  269. package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
  270. package/dist/esm-dev/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
  271. package/dist/esm-dev/packages/web/src/ui/components/atoms/Button.mjs +1 -1
  272. package/dist/esm-dev/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
  273. package/dist/esm-dev/packages/web/src/ui/components/atoms/Column.mjs +1 -1
  274. package/dist/esm-dev/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
  275. package/dist/esm-dev/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
  276. package/dist/esm-dev/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
  277. package/dist/esm-dev/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
  278. package/dist/esm-dev/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
  279. package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs +1 -1
  280. package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs +1 -1
  281. package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
  282. package/dist/esm-dev/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
  283. package/dist/esm-dev/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
  284. package/dist/esm-dev/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
  285. package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs +2 -2
  286. package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs.map +1 -1
  287. package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
  288. package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
  289. package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
  290. package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
  291. package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
  292. package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
  293. package/dist/esm-dev/packages/web/src/utils/crypto.mjs +1 -1
  294. package/dist/types/{PresentationConfig-B2jX85oV.d.ts → PresentationConfig-CdAymT0c.d.ts} +5 -0
  295. package/dist/types/{StytchB2BClient-D16e_lp1.d.ts → StytchB2BClient-DYF9xGAB.d.ts} +1 -1
  296. package/dist/types/{StytchClient-BwQdJzdj.d.ts → StytchClient-IyY7-cpI.d.ts} +1 -1
  297. package/dist/types/adminPortal/index.d.ts +3 -3
  298. package/dist/types/b2b/index.d.ts +7 -7
  299. package/dist/types/b2b/index.headless.d.ts +2 -2
  300. package/dist/types/compat.d.ts +1 -1
  301. package/dist/types/{createAuthUrlHandler-R1kNNQD_.d.ts → createAuthUrlHandler-CFZ0DGWC.d.ts} +6 -2
  302. package/dist/types/index.d.ts +7 -7
  303. package/dist/types/index.headless.d.ts +2 -2
  304. package/dist/types/{shadcn-CGdmyIUF.d.ts → shadcn-USiNERNw.d.ts} +4 -4
  305. package/messages/en.po +3 -3
  306. package/package.json +1 -1
  307. package/dist/cjs/passwordManagerDisableAutofillProps-DV31RTL_.js.map +0 -1
  308. package/dist/cjs/shadcn-aVU6Lm9q.js.map +0 -1
  309. package/dist/cjs-dev/passwordManagerDisableAutofillProps-CgiK2M_U.js.map +0 -1
  310. package/dist/cjs-dev/shadcn-DMk6ZSoD.js.map +0 -1
  311. package/dist/esm/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
  312. package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
@@ -4,31 +4,18 @@ import { UNRECOVERABLE_ERROR_TYPES } from '../../public/SDKErrors.mjs';
4
4
  class HeadlessB2BSessionClient {
5
5
  _networkClient;
6
6
  _subscriptionService;
7
- getSync;
8
- getInfo;
9
- onChange;
10
- revoke;
11
- revokeForMember;
12
- _authenticate;
13
- authenticate;
14
- exchange;
15
- exchangeAccessToken;
16
- attest;
17
- constructor(_networkClient, _subscriptionService){
18
- this._networkClient = _networkClient;
19
- this._subscriptionService = _subscriptionService;
20
- this.getSync = ()=>{
21
- return this._subscriptionService.getSession();
22
- };
23
- this.getInfo = ()=>({
24
- session: this.getSync(),
25
- fromCache: this._subscriptionService.getFromCache()
26
- });
27
- this.onChange = (callback)=>{
28
- return this._subscriptionService.subscribeToState((state)=>callback(state?.session ?? null));
29
- };
30
- this.revoke = async (options)=>{
31
- /**
7
+ getSync = ()=>{
8
+ return this._subscriptionService.getSession();
9
+ };
10
+ getInfo = ()=>({
11
+ session: this.getSync(),
12
+ fromCache: this._subscriptionService.getFromCache()
13
+ });
14
+ onChange = (callback)=>{
15
+ return this._subscriptionService.subscribeToState((state)=>callback(state?.session ?? null));
16
+ };
17
+ revoke = async (options)=>{
18
+ /**
32
19
  * Revoke destroys the local state if the API request is successful
33
20
  * or if we return an unrecoverable error (user is unauthenticated)
34
21
  * or if the developer passes in a forceClear option.
@@ -36,62 +23,69 @@ class HeadlessB2BSessionClient {
36
23
  * we do not destroy the local state to let the developer manually add retry
37
24
  * logic to call revoke again.
38
25
  */ try {
39
- const resp = await this._networkClient.fetchSDK({
40
- url: `/b2b/sessions/revoke`,
41
- method: 'POST'
42
- });
26
+ const resp = await this._networkClient.fetchSDK({
27
+ url: `/b2b/sessions/revoke`,
28
+ method: 'POST'
29
+ });
30
+ this._subscriptionService.destroyState();
31
+ return resp;
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ } catch (error) {
34
+ if (options?.forceClear) {
35
+ this._subscriptionService.destroyState();
36
+ } else if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {
43
37
  this._subscriptionService.destroyState();
44
- return resp;
45
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
- } catch (error) {
47
- if (options?.forceClear) {
48
- this._subscriptionService.destroyState();
49
- } else if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {
50
- this._subscriptionService.destroyState();
51
- }
52
- throw error;
53
38
  }
54
- };
55
- this.revokeForMember = async (options)=>{
56
- validateInDev('stytch.session.revokeForMember', options, {
57
- member_id: 'string'
58
- });
59
- return await this._networkClient.fetchSDK({
60
- url: `/b2b/sessions/revoke/${options.member_id}`,
39
+ throw error;
40
+ }
41
+ };
42
+ revokeForMember = async (options)=>{
43
+ validateInDev('stytch.session.revokeForMember', options, {
44
+ member_id: 'string'
45
+ });
46
+ return await this._networkClient.fetchSDK({
47
+ url: `/b2b/sessions/revoke/${options.member_id}`,
48
+ method: 'POST'
49
+ });
50
+ };
51
+ _authenticate = async (options)=>{
52
+ const initialSession = this._subscriptionService.getSession();
53
+ const isSessionStale = ()=>initialSession?.member_session_id !== this._subscriptionService.getSession()?.member_session_id;
54
+ try {
55
+ const requestBody = {
56
+ session_duration_minutes: options?.session_duration_minutes
57
+ };
58
+ const resp = await this._networkClient.fetchSDK({
59
+ url: '/b2b/sessions/authenticate',
60
+ body: requestBody,
61
61
  method: 'POST'
62
62
  });
63
- };
64
- this._authenticate = async (options)=>{
65
- const initialSession = this._subscriptionService.getSession();
66
- const isSessionStale = ()=>initialSession?.member_session_id !== this._subscriptionService.getSession()?.member_session_id;
67
- try {
68
- const requestBody = {
69
- session_duration_minutes: options?.session_duration_minutes
70
- };
71
- const resp = await this._networkClient.fetchSDK({
72
- url: '/b2b/sessions/authenticate',
73
- body: requestBody,
74
- method: 'POST'
75
- });
76
- if (isSessionStale()) {
77
- // [SDK-1336] The session was updated out from under us while the
78
- // request was in flight; discard the response and retry
79
- return this._authenticate(options);
80
- }
81
- return resp;
82
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
- } catch (error) {
84
- if (isSessionStale()) {
85
- // [SDK-1336] The session was updated out from under us while the
86
- // request was in flight; discard the response and retry
87
- return this._authenticate(options);
88
- }
89
- if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {
90
- this._subscriptionService.destroySession();
91
- }
92
- throw error;
63
+ if (isSessionStale()) {
64
+ // [SDK-1336] The session was updated out from under us while the
65
+ // request was in flight; discard the response and retry
66
+ return this._authenticate(options);
93
67
  }
94
- };
68
+ return resp;
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ } catch (error) {
71
+ if (isSessionStale()) {
72
+ // [SDK-1336] The session was updated out from under us while the
73
+ // request was in flight; discard the response and retry
74
+ return this._authenticate(options);
75
+ }
76
+ if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {
77
+ this._subscriptionService.destroySession();
78
+ }
79
+ throw error;
80
+ }
81
+ };
82
+ authenticate;
83
+ exchange;
84
+ exchangeAccessToken;
85
+ attest;
86
+ constructor(_networkClient, _subscriptionService){
87
+ this._networkClient = _networkClient;
88
+ this._subscriptionService = _subscriptionService;
95
89
  this.authenticate = this._subscriptionService.withUpdateSession(this._authenticate);
96
90
  this.exchange = this._subscriptionService.withUpdateSession(async (data)=>{
97
91
  validateInDev('stytch.session.exchange', data, {
@@ -1 +1 @@
1
- {"version":3,"file":"HeadlessB2BSessionClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.ts"],"sourcesContent":["import {\n IHeadlessB2BSessionClient,\n B2BSessionOnChangeCallback,\n SessionRevokeResponse,\n SessionAuthenticateOptions,\n B2BSessionAuthenticateResponse,\n B2BSessionRevokeOptions,\n SessionTokensUpdate,\n UNRECOVERABLE_ERROR_TYPES,\n B2BSessionExchangeOptions,\n B2BSessionExchangeResponse,\n MemberSessionInfo,\n StytchProjectConfigurationInput,\n SessionTokens,\n B2BSessionAccessTokenExchangeOptions,\n B2BSessionAccessTokenExchangeResponse,\n B2BSessionAttestResponse,\n B2BSessionAttestOptions,\n} from '../../public';\nimport { INetworkClient, IB2BSubscriptionService, IfOpaqueTokens, ExtractOpaqueTokens } from '../..';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BSessionClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BSessionClient<TProjectConfiguration>\n{\n getSync = () => {\n return this._subscriptionService.getSession();\n };\n\n getInfo = (): MemberSessionInfo => ({\n session: this.getSync(),\n fromCache: this._subscriptionService.getFromCache(),\n });\n\n onChange = (callback: B2BSessionOnChangeCallback) => {\n return this._subscriptionService.subscribeToState((state) => callback(state?.session ?? null));\n };\n\n revoke = async (options?: B2BSessionRevokeOptions) => {\n /**\n * Revoke destroys the local state if the API request is successful\n * or if we return an unrecoverable error (user is unauthenticated)\n * or if the developer passes in a forceClear option.\n * If the API request returns a recoverable error (the user is offline),\n * we do not destroy the local state to let the developer manually add retry\n * logic to call revoke again.\n */\n try {\n const resp = await this._networkClient.fetchSDK<SessionRevokeResponse>({\n url: `/b2b/sessions/revoke`,\n method: 'POST',\n });\n\n this._subscriptionService.destroyState();\n\n return resp;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (options?.forceClear) {\n this._subscriptionService.destroyState();\n } else if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n this._subscriptionService.destroyState();\n }\n throw error;\n }\n };\n\n revokeForMember = async (options: { member_id: string }) => {\n validateInDev('stytch.session.revokeForMember', options, {\n member_id: 'string',\n });\n\n return await this._networkClient.fetchSDK<SessionRevokeResponse>({\n url: `/b2b/sessions/revoke/${options.member_id}`,\n method: 'POST',\n });\n };\n\n private _authenticate = async (\n options?: SessionAuthenticateOptions,\n ): Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>> => {\n const initialSession = this._subscriptionService.getSession();\n const isSessionStale = () =>\n initialSession?.member_session_id !== this._subscriptionService.getSession()?.member_session_id;\n\n try {\n const requestBody = {\n session_duration_minutes: options?.session_duration_minutes,\n };\n const resp = await this._networkClient.fetchSDK<B2BSessionAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/authenticate',\n body: requestBody,\n method: 'POST',\n });\n\n if (isSessionStale()) {\n // [SDK-1336] The session was updated out from under us while the\n // request was in flight; discard the response and retry\n return this._authenticate(options);\n }\n\n return resp;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (isSessionStale()) {\n // [SDK-1336] The session was updated out from under us while the\n // request was in flight; discard the response and retry\n return this._authenticate(options);\n }\n\n if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n this._subscriptionService.destroySession();\n }\n throw error;\n }\n };\n\n authenticate: (\n options?: SessionAuthenticateOptions,\n ) => Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>>;\n\n exchange: (data: B2BSessionExchangeOptions) => Promise<B2BSessionExchangeResponse<TProjectConfiguration>>;\n\n exchangeAccessToken: (\n data: B2BSessionAccessTokenExchangeOptions,\n ) => Promise<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>;\n\n attest: (data: B2BSessionAttestOptions) => Promise<B2BSessionAttestResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(this._authenticate);\n\n this.exchange = this._subscriptionService.withUpdateSession(async (data: B2BSessionExchangeOptions) => {\n validateInDev('stytch.session.exchange', data, {\n organization_id: 'string',\n session_duration_minutes: 'number',\n locale: 'optionalString',\n });\n\n return this._networkClient.fetchSDK<B2BSessionExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/exchange',\n body: data,\n method: 'POST',\n });\n });\n\n this.exchangeAccessToken = this._subscriptionService.withUpdateSession(\n async (data: B2BSessionAccessTokenExchangeOptions) => {\n validateInDev('stytch.session.exchange', data, {\n access_token: 'string',\n session_duration_minutes: 'number',\n });\n return this._networkClient.fetchSDK<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/exchange_access_token',\n body: data,\n method: 'POST',\n });\n },\n );\n\n this.attest = this._subscriptionService.withUpdateSession(async (data: B2BSessionAttestOptions) => {\n validateInDev('stytch.session.attest', data, {\n organization_id: 'optionalString',\n profile_id: 'string',\n token: 'string',\n session_duration_minutes: 'optionalNumber',\n });\n\n return this._networkClient.fetchSDK<B2BSessionAttestResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/attest',\n body: data,\n method: 'POST',\n });\n });\n }\n\n getTokens() {\n return this._subscriptionService.getTokens() as IfOpaqueTokens<\n ExtractOpaqueTokens<TProjectConfiguration>,\n never,\n SessionTokens | null\n >;\n }\n\n updateSession(tokens: SessionTokensUpdate): void {\n validateInDev('stytch.session.updateSession', tokens, {\n session_token: 'string',\n session_jwt: 'optionalString',\n });\n this._subscriptionService.updateTokens(tokens);\n }\n}\n"],"names":["HeadlessB2BSessionClient","getSync","getInfo","onChange","revoke","revokeForMember","_authenticate","authenticate","exchange","exchangeAccessToken","attest","constructor","_subscriptionService","_networkClient","getSession","session","fromCache","getFromCache","callback","subscribeToState","state","options","resp","fetchSDK","url","method","destroyState","error","forceClear","UNRECOVERABLE_ERROR_TYPES","includes","error_type","validateInDev","member_id","initialSession","isSessionStale","member_session_id","requestBody","session_duration_minutes","body","destroySession","withUpdateSession","data","organization_id","locale","access_token","profile_id","token","getTokens","updateSession","tokens","session_token","session_jwt","updateTokens"],"mappings":"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"}
1
+ {"version":3,"file":"HeadlessB2BSessionClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.ts"],"sourcesContent":["import {\n IHeadlessB2BSessionClient,\n B2BSessionOnChangeCallback,\n SessionRevokeResponse,\n SessionAuthenticateOptions,\n B2BSessionAuthenticateResponse,\n B2BSessionRevokeOptions,\n SessionTokensUpdate,\n UNRECOVERABLE_ERROR_TYPES,\n B2BSessionExchangeOptions,\n B2BSessionExchangeResponse,\n MemberSessionInfo,\n StytchProjectConfigurationInput,\n SessionTokens,\n B2BSessionAccessTokenExchangeOptions,\n B2BSessionAccessTokenExchangeResponse,\n B2BSessionAttestResponse,\n B2BSessionAttestOptions,\n} from '../../public';\nimport { INetworkClient, IB2BSubscriptionService, IfOpaqueTokens, ExtractOpaqueTokens } from '../..';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BSessionClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BSessionClient<TProjectConfiguration>\n{\n getSync = () => {\n return this._subscriptionService.getSession();\n };\n\n getInfo = (): MemberSessionInfo => ({\n session: this.getSync(),\n fromCache: this._subscriptionService.getFromCache(),\n });\n\n onChange = (callback: B2BSessionOnChangeCallback) => {\n return this._subscriptionService.subscribeToState((state) => callback(state?.session ?? null));\n };\n\n revoke = async (options?: B2BSessionRevokeOptions) => {\n /**\n * Revoke destroys the local state if the API request is successful\n * or if we return an unrecoverable error (user is unauthenticated)\n * or if the developer passes in a forceClear option.\n * If the API request returns a recoverable error (the user is offline),\n * we do not destroy the local state to let the developer manually add retry\n * logic to call revoke again.\n */\n try {\n const resp = await this._networkClient.fetchSDK<SessionRevokeResponse>({\n url: `/b2b/sessions/revoke`,\n method: 'POST',\n });\n\n this._subscriptionService.destroyState();\n\n return resp;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (options?.forceClear) {\n this._subscriptionService.destroyState();\n } else if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n this._subscriptionService.destroyState();\n }\n throw error;\n }\n };\n\n revokeForMember = async (options: { member_id: string }) => {\n validateInDev('stytch.session.revokeForMember', options, {\n member_id: 'string',\n });\n\n return await this._networkClient.fetchSDK<SessionRevokeResponse>({\n url: `/b2b/sessions/revoke/${options.member_id}`,\n method: 'POST',\n });\n };\n\n private _authenticate = async (\n options?: SessionAuthenticateOptions,\n ): Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>> => {\n const initialSession = this._subscriptionService.getSession();\n const isSessionStale = () =>\n initialSession?.member_session_id !== this._subscriptionService.getSession()?.member_session_id;\n\n try {\n const requestBody = {\n session_duration_minutes: options?.session_duration_minutes,\n };\n const resp = await this._networkClient.fetchSDK<B2BSessionAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/authenticate',\n body: requestBody,\n method: 'POST',\n });\n\n if (isSessionStale()) {\n // [SDK-1336] The session was updated out from under us while the\n // request was in flight; discard the response and retry\n return this._authenticate(options);\n }\n\n return resp;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (isSessionStale()) {\n // [SDK-1336] The session was updated out from under us while the\n // request was in flight; discard the response and retry\n return this._authenticate(options);\n }\n\n if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n this._subscriptionService.destroySession();\n }\n throw error;\n }\n };\n\n authenticate: (\n options?: SessionAuthenticateOptions,\n ) => Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>>;\n\n exchange: (data: B2BSessionExchangeOptions) => Promise<B2BSessionExchangeResponse<TProjectConfiguration>>;\n\n exchangeAccessToken: (\n data: B2BSessionAccessTokenExchangeOptions,\n ) => Promise<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>;\n\n attest: (data: B2BSessionAttestOptions) => Promise<B2BSessionAttestResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(this._authenticate);\n\n this.exchange = this._subscriptionService.withUpdateSession(async (data: B2BSessionExchangeOptions) => {\n validateInDev('stytch.session.exchange', data, {\n organization_id: 'string',\n session_duration_minutes: 'number',\n locale: 'optionalString',\n });\n\n return this._networkClient.fetchSDK<B2BSessionExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/exchange',\n body: data,\n method: 'POST',\n });\n });\n\n this.exchangeAccessToken = this._subscriptionService.withUpdateSession(\n async (data: B2BSessionAccessTokenExchangeOptions) => {\n validateInDev('stytch.session.exchange', data, {\n access_token: 'string',\n session_duration_minutes: 'number',\n });\n return this._networkClient.fetchSDK<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/exchange_access_token',\n body: data,\n method: 'POST',\n });\n },\n );\n\n this.attest = this._subscriptionService.withUpdateSession(async (data: B2BSessionAttestOptions) => {\n validateInDev('stytch.session.attest', data, {\n organization_id: 'optionalString',\n profile_id: 'string',\n token: 'string',\n session_duration_minutes: 'optionalNumber',\n });\n\n return this._networkClient.fetchSDK<B2BSessionAttestResponse<TProjectConfiguration>>({\n url: '/b2b/sessions/attest',\n body: data,\n method: 'POST',\n });\n });\n }\n\n getTokens() {\n return this._subscriptionService.getTokens() as IfOpaqueTokens<\n ExtractOpaqueTokens<TProjectConfiguration>,\n never,\n SessionTokens | null\n >;\n }\n\n updateSession(tokens: SessionTokensUpdate): void {\n validateInDev('stytch.session.updateSession', tokens, {\n session_token: 'string',\n session_jwt: 'optionalString',\n });\n this._subscriptionService.updateTokens(tokens);\n }\n}\n"],"names":["HeadlessB2BSessionClient","getSync","_subscriptionService","getSession","getInfo","session","fromCache","getFromCache","onChange","callback","subscribeToState","state","revoke","options","resp","_networkClient","fetchSDK","url","method","destroyState","error","forceClear","UNRECOVERABLE_ERROR_TYPES","includes","error_type","revokeForMember","validateInDev","member_id","_authenticate","initialSession","isSessionStale","member_session_id","requestBody","session_duration_minutes","body","destroySession","authenticate","exchange","exchangeAccessToken","attest","withUpdateSession","data","organization_id","locale","access_token","profile_id","token","getTokens","updateSession","tokens","session_token","session_jwt","updateTokens"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeadlessB2BTOTPsClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.ts"],"sourcesContent":["import { IB2BSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '../..';\nimport {\n B2BTOTPAuthenticateOptions,\n B2BTOTPAuthenticateResponse,\n B2BTOTPCreateOptions,\n B2BTOTPCreateResponse,\n IHeadlessB2BTOTPsClient,\n} from '../../public/b2b/totp';\nimport { StytchProjectConfigurationInput } from '../../public/typeConfig';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BTOTPsClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BTOTPsClient<TProjectConfiguration>\n{\n authenticate: (data: B2BTOTPAuthenticateOptions) => Promise<B2BTOTPAuthenticateResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (data: B2BTOTPAuthenticateOptions): Promise<B2BTOTPAuthenticateResponse<TProjectConfiguration>> => {\n validateInDev('stytch.totp.authenticate', data, {\n organization_id: 'string',\n member_id: 'string',\n code: 'string',\n session_duration_minutes: 'number',\n set_mfa_enrollment: 'optionalString',\n set_default_mfa: 'optionalBoolean',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n const requestBody = {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n intermediate_session_token: this._subscriptionService.getIntermediateSessionToken() || undefined,\n };\n\n return this._networkClient.retriableFetchSDK<B2BTOTPAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/totp/authenticate',\n body: requestBody,\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n },\n );\n }\n\n async create(data: B2BTOTPCreateOptions): Promise<B2BTOTPCreateResponse> {\n validateInDev('stytch.totp.create', data, {\n organization_id: 'string',\n member_id: 'string',\n expiration_minutes: 'optionalNumber',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n const response = await this._networkClient.retriableFetchSDK<B2BTOTPCreateResponse>({\n url: '/b2b/totp',\n body: {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n },\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n\n if (response.member_id === this._subscriptionService.getMember()?.member_id) {\n this._subscriptionService.updateMember(response.member);\n }\n\n return response;\n }\n}\n"],"names":["HeadlessB2BTOTPsClient","authenticate","constructor","_networkClient","_subscriptionService","dfpProtectedAuth","withUpdateSession","data","validateInDev","organization_id","member_id","code","session_duration_minutes","set_mfa_enrollment","set_default_mfa","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","requestBody","intermediate_session_token","getIntermediateSessionToken","undefined","retriableFetchSDK","url","body","method","retryCallback","retryWithCaptchaAndDFP","create","expiration_minutes","response","getMember","updateMember","member"],"mappings":";;AAWO,MAAMA,sBAAAA,CAAAA;;;;IAGXC,YAAAA;IAEAC,WAAAA,CACUC,cAA8B,EAC9BC,oBAAoE,EACpEC,gBAA2C,CACnD;aAHQF,cAAAA,GAAAA,cAAAA;aACAC,oBAAAA,GAAAA,oBAAAA;aACAC,gBAAAA,GAAAA,gBAAAA;QAER,IAAI,CAACJ,YAAY,GAAG,IAAI,CAACG,oBAAoB,CAACE,iBAAiB,CAC7D,OAAOC,IAAAA,GAAAA;AACLC,YAAAA,aAAAA,CAAc,4BAA4BD,IAAAA,EAAM;gBAC9CE,eAAAA,EAAiB,QAAA;gBACjBC,SAAAA,EAAW,QAAA;gBACXC,IAAAA,EAAM,QAAA;gBACNC,wBAAAA,EAA0B,QAAA;gBAC1BC,kBAAAA,EAAoB,gBAAA;gBACpBC,eAAAA,EAAiB;AACnB,aAAA,CAAA;YACA,MAAM,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAG,MAAM,IAAI,CAACX,gBAAgB,CAACY,2BAA2B,EAAA;AACnG,YAAA,MAAMC,WAAAA,GAAc;AAClB,gBAAA,GAAGX,IAAI;AACPQ,gBAAAA,gBAAAA;AACAC,gBAAAA,aAAAA;AACAG,gBAAAA,0BAAAA,EAA4B,IAAI,CAACf,oBAAoB,CAACgB,2BAA2B,EAAA,IAAMC;AACzF,aAAA;AAEA,YAAA,OAAO,IAAI,CAAClB,cAAc,CAACmB,iBAAiB,CAAqD;gBAC/FC,GAAAA,EAAK,wBAAA;gBACLC,IAAAA,EAAMN,WAAAA;gBACNO,MAAAA,EAAQ,MAAA;AACRC,gBAAAA,aAAAA,EAAe,IAAI,CAACrB,gBAAgB,CAACsB;AACvC,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEJ,IAAA;IAEA,MAAMC,MAAAA,CAAOrB,IAA0B,EAAkC;AACvEC,QAAAA,aAAAA,CAAc,sBAAsBD,IAAAA,EAAM;YACxCE,eAAAA,EAAiB,QAAA;YACjBC,SAAAA,EAAW,QAAA;YACXmB,kBAAAA,EAAoB;AACtB,SAAA,CAAA;QACA,MAAM,EAAEd,gBAAgB,EAAEC,aAAa,EAAE,GAAG,MAAM,IAAI,CAACX,gBAAgB,CAACY,2BAA2B,EAAA;AACnG,QAAA,MAAMa,WAAW,MAAM,IAAI,CAAC3B,cAAc,CAACmB,iBAAiB,CAAwB;YAClFC,GAAAA,EAAK,WAAA;YACLC,IAAAA,EAAM;AACJ,gBAAA,GAAGjB,IAAI;AACPQ,gBAAAA,gBAAAA;AACAC,gBAAAA,aAAAA;AACAG,gBAAAA,0BAAAA,EAA4B,MAAO,IAAI,CAACf,oBAAoB,CAACgB,2BAA2B,EAAA,IAAOC;AACjG,aAAA;YACAI,MAAAA,EAAQ,MAAA;AACRC,YAAAA,aAAAA,EAAe,IAAI,CAACrB,gBAAgB,CAACsB;AACvC,SAAA,CAAA;QAEA,IAAIG,QAAAA,CAASpB,SAAS,KAAK,IAAI,CAACN,oBAAoB,CAAC2B,SAAS,EAAA,EAAIrB,SAAAA,EAAW;AAC3E,YAAA,IAAI,CAACN,oBAAoB,CAAC4B,YAAY,CAACF,SAASG,MAAM,CAAA;AACxD,QAAA;QAEA,OAAOH,QAAAA;AACT,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"HeadlessB2BTOTPsClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.ts"],"sourcesContent":["import { IB2BSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '../..';\nimport {\n B2BTOTPAuthenticateOptions,\n B2BTOTPAuthenticateResponse,\n B2BTOTPCreateOptions,\n B2BTOTPCreateResponse,\n IHeadlessB2BTOTPsClient,\n} from '../../public/b2b/totp';\nimport { StytchProjectConfigurationInput } from '../../public/typeConfig';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BTOTPsClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BTOTPsClient<TProjectConfiguration>\n{\n authenticate: (data: B2BTOTPAuthenticateOptions) => Promise<B2BTOTPAuthenticateResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (data: B2BTOTPAuthenticateOptions): Promise<B2BTOTPAuthenticateResponse<TProjectConfiguration>> => {\n validateInDev('stytch.totp.authenticate', data, {\n organization_id: 'string',\n member_id: 'string',\n code: 'string',\n session_duration_minutes: 'number',\n set_mfa_enrollment: 'optionalString',\n set_default_mfa: 'optionalBoolean',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n const requestBody = {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n intermediate_session_token: this._subscriptionService.getIntermediateSessionToken() || undefined,\n };\n\n return this._networkClient.retriableFetchSDK<B2BTOTPAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/totp/authenticate',\n body: requestBody,\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n },\n );\n }\n\n async create(data: B2BTOTPCreateOptions): Promise<B2BTOTPCreateResponse> {\n validateInDev('stytch.totp.create', data, {\n organization_id: 'string',\n member_id: 'string',\n expiration_minutes: 'optionalNumber',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n const response = await this._networkClient.retriableFetchSDK<B2BTOTPCreateResponse>({\n url: '/b2b/totp',\n body: {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n },\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n\n if (response.member_id === this._subscriptionService.getMember()?.member_id) {\n this._subscriptionService.updateMember(response.member);\n }\n\n return response;\n }\n}\n"],"names":["HeadlessB2BTOTPsClient","authenticate","_networkClient","_subscriptionService","dfpProtectedAuth","withUpdateSession","data","validateInDev","organization_id","member_id","code","session_duration_minutes","set_mfa_enrollment","set_default_mfa","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","requestBody","intermediate_session_token","getIntermediateSessionToken","undefined","retriableFetchSDK","url","body","method","retryCallback","retryWithCaptchaAndDFP","create","expiration_minutes","response","getMember","updateMember","member"],"mappings":";;AAWO,MAAMA,sBAAAA,CAAAA;;;;IAGXC,YAAAA;IAEA,WAAA,CACUC,cAA8B,EAC9BC,oBAAoE,EACpEC,gBAA2C,CACnD;aAHQF,cAAAA,GAAAA,cAAAA;aACAC,oBAAAA,GAAAA,oBAAAA;aACAC,gBAAAA,GAAAA,gBAAAA;QAER,IAAI,CAACH,YAAY,GAAG,IAAI,CAACE,oBAAoB,CAACE,iBAAiB,CAC7D,OAAOC,IAAAA,GAAAA;AACLC,YAAAA,aAAAA,CAAc,4BAA4BD,IAAAA,EAAM;gBAC9CE,eAAAA,EAAiB,QAAA;gBACjBC,SAAAA,EAAW,QAAA;gBACXC,IAAAA,EAAM,QAAA;gBACNC,wBAAAA,EAA0B,QAAA;gBAC1BC,kBAAAA,EAAoB,gBAAA;gBACpBC,eAAAA,EAAiB;AACnB,aAAA,CAAA;YACA,MAAM,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAG,MAAM,IAAI,CAACX,gBAAgB,CAACY,2BAA2B,EAAA;AACnG,YAAA,MAAMC,WAAAA,GAAc;AAClB,gBAAA,GAAGX,IAAI;AACPQ,gBAAAA,gBAAAA;AACAC,gBAAAA,aAAAA;AACAG,gBAAAA,0BAAAA,EAA4B,IAAI,CAACf,oBAAoB,CAACgB,2BAA2B,EAAA,IAAMC;AACzF,aAAA;AAEA,YAAA,OAAO,IAAI,CAAClB,cAAc,CAACmB,iBAAiB,CAAqD;gBAC/FC,GAAAA,EAAK,wBAAA;gBACLC,IAAAA,EAAMN,WAAAA;gBACNO,MAAAA,EAAQ,MAAA;AACRC,gBAAAA,aAAAA,EAAe,IAAI,CAACrB,gBAAgB,CAACsB;AACvC,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEJ,IAAA;IAEA,MAAMC,MAAAA,CAAOrB,IAA0B,EAAkC;AACvEC,QAAAA,aAAAA,CAAc,sBAAsBD,IAAAA,EAAM;YACxCE,eAAAA,EAAiB,QAAA;YACjBC,SAAAA,EAAW,QAAA;YACXmB,kBAAAA,EAAoB;AACtB,SAAA,CAAA;QACA,MAAM,EAAEd,gBAAgB,EAAEC,aAAa,EAAE,GAAG,MAAM,IAAI,CAACX,gBAAgB,CAACY,2BAA2B,EAAA;AACnG,QAAA,MAAMa,WAAW,MAAM,IAAI,CAAC3B,cAAc,CAACmB,iBAAiB,CAAwB;YAClFC,GAAAA,EAAK,WAAA;YACLC,IAAAA,EAAM;AACJ,gBAAA,GAAGjB,IAAI;AACPQ,gBAAAA,gBAAAA;AACAC,gBAAAA,aAAAA;AACAG,gBAAAA,0BAAAA,EAA4B,MAAO,IAAI,CAACf,oBAAoB,CAACgB,2BAA2B,EAAA,IAAOC;AACjG,aAAA;YACAI,MAAAA,EAAQ,MAAA;AACRC,YAAAA,aAAAA,EAAe,IAAI,CAACrB,gBAAgB,CAACsB;AACvC,SAAA,CAAA;QAEA,IAAIG,QAAAA,CAASpB,SAAS,KAAK,IAAI,CAACN,oBAAoB,CAAC2B,SAAS,EAAA,EAAIrB,SAAAA,EAAW;AAC3E,YAAA,IAAI,CAACN,oBAAoB,CAAC4B,YAAY,CAACF,SAASG,MAAM,CAAA;AACxD,QAAA;QAEA,OAAOH,QAAAA;AACT,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkClient.mjs","sources":["../../../../../../core/src/NetworkClient.ts"],"sourcesContent":["import { AnalyticsEvent } from './Events';\nimport { ResponseCommon, StytchAPIUnreachableError, StytchAPIError, StytchAPISchemaError } from './public';\n\ntype SDKRequestMethodAndBody =\n | {\n method: 'GET' | 'DELETE';\n body?: null;\n }\n | {\n method: 'POST' | 'PUT';\n body?: Record<string, unknown>;\n };\n\nexport type SDKRequestInfo = SDKRequestMethodAndBody & {\n url: string;\n additionalMetadata?: Record<string, string>;\n};\n\nexport interface SDKTelemetry {\n event_id: string;\n app_session_id: string;\n persistent_id: string;\n client_sent_at: string;\n timezone: string;\n\n // Logged in user data\n // Why don't we generate this from the session_token in the auth header?\n // - We don't want to tie analytics ingest to session validation. There's no need to put\n // that kind of pressure on API, and ingest could be moved to somewhere that doesn't\n // have the ability to validate tokens\n // - For bulk event batches, we want to keep track of whether or not a user was logged\n // in at each event. If we have 10 events, the user logs in at event 5, then they'll have\n // a token when they log the batch, but we want to know that they were not logged in for the\n // first 4 events\n\n // Versioning\n app: {\n identifier: string;\n version?: string;\n };\n os?: {\n identifier?: string;\n version?: string;\n };\n device?: {\n model?: string;\n screen_size?: string;\n };\n sdk: {\n identifier: string;\n version: string;\n };\n}\n\nexport type AdditionalTelemetryData =\n | { stytch_user_id?: string; stytch_session_id?: string }\n | { stytch_member_id?: string; stytch_member_session_id?: string };\n\nexport interface INetworkClient {\n createTelemetryBlob(additionalMetadata?: SDKRequestInfo['additionalMetadata']): SDKTelemetry;\n\n fetchSDK: <T extends ResponseCommon>(info: SDKRequestInfo) => Promise<T>;\n\n retriableFetchSDK: <T extends ResponseCommon>(info: RetriableSDKRequestInfo) => Promise<T>;\n\n logEvent<E extends AnalyticsEvent>({\n name,\n details,\n error,\n }: {\n name: E['name'];\n details: E['details'];\n error?: { error_code?: string; error_description?: string; http_status_code?: string };\n }): void;\n\n // @deprecated Use the new sessions.updateSession() method instead\n updateSessionToken: (sessionToken: string | null) => void;\n}\n\nexport type RetriableSDKRequestInfo = SDKRequestInfo & {\n retryCallback: (e: RetriableError, info: SDKBaseRequestInfo) => Promise<SDKBaseRequestInfo>;\n};\n\nexport type RetriableSDKBaseRequestInfo = SDKBaseRequestInfo & {\n retryCallback: (e: RetriableError, info: SDKBaseRequestInfo) => Promise<SDKBaseRequestInfo>;\n};\n\nexport enum RetriableErrorType {\n RequiredCaptcha = 'CAPTCHA required',\n}\n\nexport class RetriableError extends Error {\n type: RetriableErrorType;\n\n constructor(type: RetriableErrorType) {\n super(type);\n this.type = type;\n }\n}\n\nexport async function retriableFetchSDK<T extends ResponseCommon>({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n retryCallback,\n}: RetriableSDKBaseRequestInfo): Promise<T> {\n let req: SDKBaseRequestInfo = {\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n };\n\n try {\n return await baseFetchSDK<T>(req);\n } catch (err) {\n if (err instanceof RetriableError) {\n req = await retryCallback(err, req);\n return await baseFetchSDK<T>(req);\n }\n throw err;\n }\n}\n\nexport type SDKBaseRequestInfo = {\n basicAuthHeader: string;\n xSDKClientHeader: string;\n xSDKParentHostHeader?: string;\n body: SDKRequestInfo['body'];\n method: SDKRequestInfo['method'];\n finalURL: string;\n};\n\nexport async function baseFetchSDK<T extends ResponseCommon>({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n}: SDKBaseRequestInfo): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: basicAuthHeader,\n 'Content-Type': 'application/json',\n 'X-SDK-Client': xSDKClientHeader,\n };\n\n if (xSDKParentHostHeader) {\n headers['X-SDK-Parent-Host'] = xSDKParentHostHeader;\n }\n\n const fetchOpts: RequestInit = {\n method,\n headers,\n body: body && JSON.stringify(body),\n credentials: 'include',\n };\n\n let resp;\n try {\n resp = await fetch(finalURL, fetchOpts);\n /* eslint-disable @typescript-eslint/no-explicit-any */\n } catch (e: any) {\n if (e.message === 'Failed to fetch') {\n throw new StytchAPIUnreachableError('Unable to contact our servers.');\n }\n throw e;\n }\n\n // We only return 200 from WB endpoints, but just in case let's accept all 2xx errors\n if (resp.status <= 299) {\n try {\n const respData = await resp.json();\n return respData.data;\n } catch {\n throw new StytchAPIUnreachableError('Invalid JSON response from our servers.');\n }\n }\n\n // 99% of errors will be well-formed JSON errors with an appropriate content-type set\n if (resp.status !== 200 && resp.headers.get('content-type')?.includes('application/json')) {\n let respError;\n try {\n respError = await resp.json();\n } catch {\n // Error was not JSON- but the content type said it was! This means the server lied to us, which it should never do...\n throw new StytchAPIUnreachableError('Invalid or no response from server');\n }\n // If this looks like a JSONSchema validation error, it probably means the caller isn't using\n // typescript and gave us a bad type.\n if ('body' in respError || 'params' in respError || 'query' in respError) {\n throw new StytchAPISchemaError(respError);\n }\n throw new StytchAPIError(respError);\n }\n\n // Finally handle the other 1% of errors (Captcha errors, network errors, 503s, etc.)\n let respData;\n try {\n respData = await resp.text();\n } catch {\n throw new StytchAPIUnreachableError('Invalid response from our servers.');\n }\n if (respData.includes('Captcha required')) {\n throw new RetriableError(RetriableErrorType.RequiredCaptcha);\n }\n throw new StytchAPIUnreachableError('Invalid response from our servers.');\n}\n\nexport async function baseSubmitFormSDK({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n}: SDKBaseRequestInfo): Promise<void> {\n const bodyParams = (body || {}) as Record<string, string>;\n const finalBody: Record<string, string> = {\n ...bodyParams,\n __Authorization: basicAuthHeader,\n '__X-SDK-Client': xSDKClientHeader,\n };\n\n if (xSDKParentHostHeader) {\n finalBody['__X-SDK-Parent-Host'] = xSDKParentHostHeader;\n }\n\n const children: HTMLInputElement[] = Object.entries(finalBody).map(([key, value]) => {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = key;\n input.value = value;\n return input;\n });\n\n const form = document.createElement('form');\n form.method = method;\n form.action = finalURL;\n form.append(...children);\n\n document.body.appendChild(form);\n form.submit();\n}\n"],"names":["RetriableErrorType","RetriableError","Error","type","constructor","retriableFetchSDK","method","finalURL","basicAuthHeader","xSDKClientHeader","xSDKParentHostHeader","body","retryCallback","req","baseFetchSDK","err","headers","Authorization","fetchOpts","JSON","stringify","credentials","resp","fetch","e","message","StytchAPIUnreachableError","status","respData","json","data","get","includes","respError","StytchAPISchemaError","StytchAPIError","text","baseSubmitFormSDK","bodyParams","finalBody","__Authorization","children","Object","entries","map","key","value","input","document","createElement","name","form","action","append","appendChild","submit"],"mappings":";;AAuFO,IAAA,kBAAKA,iBAAAA,SAAAA,kBAAAA,EAAAA;;AAAAA,IAAAA,OAAAA,kBAAAA;AAEX,CAAA,CAAA,EAAA;AAEM,MAAMC,cAAAA,SAAuBC,KAAAA,CAAAA;IAClCC,IAAAA;AAEAC,IAAAA,WAAAA,CAAYD,IAAwB,CAAE;AACpC,QAAA,KAAK,CAACA,IAAAA,CAAAA;QACN,IAAI,CAACA,IAAI,GAAGA,IAAAA;AACd,IAAA;AACF;AAEO,eAAeE,iBAAAA,CAA4C,EAChEC,MAAM,EACNC,QAAQ,EACRC,eAAe,EACfC,gBAAgB,EAChBC,oBAAoB,EACpBC,IAAI,EACJC,aAAa,EACe,EAAA;AAC5B,IAAA,IAAIC,GAAAA,GAA0B;AAC5BP,QAAAA,MAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,eAAAA;AACAC,QAAAA,gBAAAA;AACAC,QAAAA,oBAAAA;AACAC,QAAAA;AACF,KAAA;IAEA,IAAI;AACF,QAAA,OAAO,MAAMG,YAAAA,CAAgBD,GAAAA,CAAAA;AAC/B,IAAA,CAAA,CAAE,OAAOE,GAAAA,EAAK;AACZ,QAAA,IAAIA,eAAed,cAAAA,EAAgB;YACjCY,GAAAA,GAAM,MAAMD,cAAcG,GAAAA,EAAKF,GAAAA,CAAAA;AAC/B,YAAA,OAAO,MAAMC,YAAAA,CAAgBD,GAAAA,CAAAA;AAC/B,QAAA;QACA,MAAME,GAAAA;AACR,IAAA;AACF;AAWO,eAAeD,YAAAA,CAAuC,EAC3DR,MAAM,EACNC,QAAQ,EACRC,eAAe,EACfC,gBAAgB,EAChBC,oBAAoB,EACpBC,IAAI,EACe,EAAA;AACnB,IAAA,MAAMK,OAAAA,GAAkC;QACtCC,aAAAA,EAAeT,eAAAA;QACf,cAAA,EAAgB,kBAAA;QAChB,cAAA,EAAgBC;AAClB,KAAA;AAEA,IAAA,IAAIC,oBAAAA,EAAsB;QACxBM,OAAO,CAAC,oBAAoB,GAAGN,oBAAAA;AACjC,IAAA;AAEA,IAAA,MAAMQ,SAAAA,GAAyB;AAC7BZ,QAAAA,MAAAA;AACAU,QAAAA,OAAAA;QACAL,IAAAA,EAAMA,IAAAA,IAAQQ,IAAAA,CAAKC,SAAS,CAACT,IAAAA,CAAAA;QAC7BU,WAAAA,EAAa;AACf,KAAA;IAEA,IAAIC,IAAAA;IACJ,IAAI;QACFA,IAAAA,GAAO,MAAMC,MAAMhB,QAAAA,EAAUW,SAAAA,CAAAA;6DAE/B,CAAA,CAAE,OAAOM,CAAAA,EAAQ;QACf,IAAIA,CAAAA,CAAEC,OAAO,KAAK,iBAAA,EAAmB;AACnC,YAAA,MAAM,IAAIC,yBAAAA,CAA0B,gCAAA,CAAA;AACtC,QAAA;QACA,MAAMF,CAAAA;AACR,IAAA;;IAGA,IAAIF,IAAAA,CAAKK,MAAM,IAAI,GAAA,EAAK;QACtB,IAAI;YACF,MAAMC,QAAAA,GAAW,MAAMN,IAAAA,CAAKO,IAAI,EAAA;AAChC,YAAA,OAAOD,SAASE,IAAI;AACtB,QAAA,CAAA,CAAE,OAAM;AACN,YAAA,MAAM,IAAIJ,yBAAAA,CAA0B,yCAAA,CAAA;AACtC,QAAA;AACF,IAAA;;IAGA,IAAIJ,IAAAA,CAAKK,MAAM,KAAK,GAAA,IAAOL,IAAAA,CAAKN,OAAO,CAACe,GAAG,CAAC,cAAA,CAAA,EAAiBC,QAAAA,CAAS,kBAAA,CAAA,EAAqB;QACzF,IAAIC,SAAAA;QACJ,IAAI;YACFA,SAAAA,GAAY,MAAMX,KAAKO,IAAI,EAAA;AAC7B,QAAA,CAAA,CAAE,OAAM;;AAEN,YAAA,MAAM,IAAIH,yBAAAA,CAA0B,oCAAA,CAAA;AACtC,QAAA;;;AAGA,QAAA,IAAI,MAAA,IAAUO,SAAAA,IAAa,QAAA,IAAYA,SAAAA,IAAa,WAAWA,SAAAA,EAAW;AACxE,YAAA,MAAM,IAAIC,oBAAAA,CAAqBD,SAAAA,CAAAA;AACjC,QAAA;AACA,QAAA,MAAM,IAAIE,cAAAA,CAAeF,SAAAA,CAAAA;AAC3B,IAAA;;IAGA,IAAIL,QAAAA;IACJ,IAAI;QACFA,QAAAA,GAAW,MAAMN,KAAKc,IAAI,EAAA;AAC5B,IAAA,CAAA,CAAE,OAAM;AACN,QAAA,MAAM,IAAIV,yBAAAA,CAA0B,oCAAA,CAAA;AACtC,IAAA;IACA,IAAIE,QAAAA,CAASI,QAAQ,CAAC,kBAAA,CAAA,EAAqB;AACzC,QAAA,MAAM,IAAI/B,cAAAA,CAAAA,kBAAAA,CAAAA;AACZ,IAAA;AACA,IAAA,MAAM,IAAIyB,yBAAAA,CAA0B,oCAAA,CAAA;AACtC;AAEO,eAAeW,iBAAAA,CAAkB,EACtC/B,MAAM,EACNC,QAAQ,EACRC,eAAe,EACfC,gBAAgB,EAChBC,oBAAoB,EACpBC,IAAI,EACe,EAAA;IACnB,MAAM2B,UAAAA,GAAc3B,QAAQ,EAAC;AAC7B,IAAA,MAAM4B,SAAAA,GAAoC;AACxC,QAAA,GAAGD,UAAU;QACbE,eAAAA,EAAiBhC,eAAAA;QACjB,gBAAA,EAAkBC;AACpB,KAAA;AAEA,IAAA,IAAIC,oBAAAA,EAAsB;QACxB6B,SAAS,CAAC,sBAAsB,GAAG7B,oBAAAA;AACrC,IAAA;IAEA,MAAM+B,QAAAA,GAA+BC,MAAAA,CAAOC,OAAO,CAACJ,SAAAA,CAAAA,CAAWK,GAAG,CAAC,CAAC,CAACC,GAAAA,EAAKC,KAAAA,CAAM,GAAA;QAC9E,MAAMC,KAAAA,GAAQC,QAAAA,CAASC,aAAa,CAAC,OAAA,CAAA;AACrCF,QAAAA,KAAAA,CAAM5C,IAAI,GAAG,QAAA;AACb4C,QAAAA,KAAAA,CAAMG,IAAI,GAAGL,GAAAA;AACbE,QAAAA,KAAAA,CAAMD,KAAK,GAAGA,KAAAA;QACd,OAAOC,KAAAA;AACT,IAAA,CAAA,CAAA;IAEA,MAAMI,IAAAA,GAAOH,QAAAA,CAASC,aAAa,CAAC,MAAA,CAAA;AACpCE,IAAAA,IAAAA,CAAK7C,MAAM,GAAGA,MAAAA;AACd6C,IAAAA,IAAAA,CAAKC,MAAM,GAAG7C,QAAAA;AACd4C,IAAAA,IAAAA,CAAKE,MAAM,CAAA,GAAIZ,QAAAA,CAAAA;IAEfO,QAAAA,CAASrC,IAAI,CAAC2C,WAAW,CAACH,IAAAA,CAAAA;AAC1BA,IAAAA,IAAAA,CAAKI,MAAM,EAAA;AACb;;;;"}
1
+ {"version":3,"file":"NetworkClient.mjs","sources":["../../../../../../core/src/NetworkClient.ts"],"sourcesContent":["import { AnalyticsEvent } from './Events';\nimport { ResponseCommon, StytchAPIUnreachableError, StytchAPIError, StytchAPISchemaError } from './public';\n\ntype SDKRequestMethodAndBody =\n | {\n method: 'GET' | 'DELETE';\n body?: null;\n }\n | {\n method: 'POST' | 'PUT';\n body?: Record<string, unknown>;\n };\n\nexport type SDKRequestInfo = SDKRequestMethodAndBody & {\n url: string;\n additionalMetadata?: Record<string, string>;\n};\n\nexport interface SDKTelemetry {\n event_id: string;\n app_session_id: string;\n persistent_id: string;\n client_sent_at: string;\n timezone: string;\n\n // Logged in user data\n // Why don't we generate this from the session_token in the auth header?\n // - We don't want to tie analytics ingest to session validation. There's no need to put\n // that kind of pressure on API, and ingest could be moved to somewhere that doesn't\n // have the ability to validate tokens\n // - For bulk event batches, we want to keep track of whether or not a user was logged\n // in at each event. If we have 10 events, the user logs in at event 5, then they'll have\n // a token when they log the batch, but we want to know that they were not logged in for the\n // first 4 events\n\n // Versioning\n app: {\n identifier: string;\n version?: string;\n };\n os?: {\n identifier?: string;\n version?: string;\n };\n device?: {\n model?: string;\n screen_size?: string;\n };\n sdk: {\n identifier: string;\n version: string;\n };\n}\n\nexport type AdditionalTelemetryData =\n | { stytch_user_id?: string; stytch_session_id?: string }\n | { stytch_member_id?: string; stytch_member_session_id?: string };\n\nexport interface INetworkClient {\n createTelemetryBlob(additionalMetadata?: SDKRequestInfo['additionalMetadata']): SDKTelemetry;\n\n fetchSDK: <T extends ResponseCommon>(info: SDKRequestInfo) => Promise<T>;\n\n retriableFetchSDK: <T extends ResponseCommon>(info: RetriableSDKRequestInfo) => Promise<T>;\n\n logEvent<E extends AnalyticsEvent>({\n name,\n details,\n error,\n }: {\n name: E['name'];\n details: E['details'];\n error?: { error_code?: string; error_description?: string; http_status_code?: string };\n }): void;\n\n // @deprecated Use the new sessions.updateSession() method instead\n updateSessionToken: (sessionToken: string | null) => void;\n}\n\nexport type RetriableSDKRequestInfo = SDKRequestInfo & {\n retryCallback: (e: RetriableError, info: SDKBaseRequestInfo) => Promise<SDKBaseRequestInfo>;\n};\n\nexport type RetriableSDKBaseRequestInfo = SDKBaseRequestInfo & {\n retryCallback: (e: RetriableError, info: SDKBaseRequestInfo) => Promise<SDKBaseRequestInfo>;\n};\n\nexport enum RetriableErrorType {\n RequiredCaptcha = 'CAPTCHA required',\n}\n\nexport class RetriableError extends Error {\n type: RetriableErrorType;\n\n constructor(type: RetriableErrorType) {\n super(type);\n this.type = type;\n }\n}\n\nexport async function retriableFetchSDK<T extends ResponseCommon>({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n retryCallback,\n}: RetriableSDKBaseRequestInfo): Promise<T> {\n let req: SDKBaseRequestInfo = {\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n };\n\n try {\n return await baseFetchSDK<T>(req);\n } catch (err) {\n if (err instanceof RetriableError) {\n req = await retryCallback(err, req);\n return await baseFetchSDK<T>(req);\n }\n throw err;\n }\n}\n\nexport type SDKBaseRequestInfo = {\n basicAuthHeader: string;\n xSDKClientHeader: string;\n xSDKParentHostHeader?: string;\n body: SDKRequestInfo['body'];\n method: SDKRequestInfo['method'];\n finalURL: string;\n};\n\nexport async function baseFetchSDK<T extends ResponseCommon>({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n}: SDKBaseRequestInfo): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: basicAuthHeader,\n 'Content-Type': 'application/json',\n 'X-SDK-Client': xSDKClientHeader,\n };\n\n if (xSDKParentHostHeader) {\n headers['X-SDK-Parent-Host'] = xSDKParentHostHeader;\n }\n\n const fetchOpts: RequestInit = {\n method,\n headers,\n body: body && JSON.stringify(body),\n credentials: 'include',\n };\n\n let resp;\n try {\n resp = await fetch(finalURL, fetchOpts);\n /* eslint-disable @typescript-eslint/no-explicit-any */\n } catch (e: any) {\n if (e.message === 'Failed to fetch') {\n throw new StytchAPIUnreachableError('Unable to contact our servers.');\n }\n throw e;\n }\n\n // We only return 200 from WB endpoints, but just in case let's accept all 2xx errors\n if (resp.status <= 299) {\n try {\n const respData = await resp.json();\n return respData.data;\n } catch {\n throw new StytchAPIUnreachableError('Invalid JSON response from our servers.');\n }\n }\n\n // 99% of errors will be well-formed JSON errors with an appropriate content-type set\n if (resp.status !== 200 && resp.headers.get('content-type')?.includes('application/json')) {\n let respError;\n try {\n respError = await resp.json();\n } catch {\n // Error was not JSON- but the content type said it was! This means the server lied to us, which it should never do...\n throw new StytchAPIUnreachableError('Invalid or no response from server');\n }\n // If this looks like a JSONSchema validation error, it probably means the caller isn't using\n // typescript and gave us a bad type.\n if ('body' in respError || 'params' in respError || 'query' in respError) {\n throw new StytchAPISchemaError(respError);\n }\n throw new StytchAPIError(respError);\n }\n\n // Finally handle the other 1% of errors (Captcha errors, network errors, 503s, etc.)\n let respData;\n try {\n respData = await resp.text();\n } catch {\n throw new StytchAPIUnreachableError('Invalid response from our servers.');\n }\n if (respData.includes('Captcha required')) {\n throw new RetriableError(RetriableErrorType.RequiredCaptcha);\n }\n throw new StytchAPIUnreachableError('Invalid response from our servers.');\n}\n\nexport async function baseSubmitFormSDK({\n method,\n finalURL,\n basicAuthHeader,\n xSDKClientHeader,\n xSDKParentHostHeader,\n body,\n}: SDKBaseRequestInfo): Promise<void> {\n const bodyParams = (body || {}) as Record<string, string>;\n const finalBody: Record<string, string> = {\n ...bodyParams,\n __Authorization: basicAuthHeader,\n '__X-SDK-Client': xSDKClientHeader,\n };\n\n if (xSDKParentHostHeader) {\n finalBody['__X-SDK-Parent-Host'] = xSDKParentHostHeader;\n }\n\n const children: HTMLInputElement[] = Object.entries(finalBody).map(([key, value]) => {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = key;\n input.value = value;\n return input;\n });\n\n const form = document.createElement('form');\n form.method = method;\n form.action = finalURL;\n form.append(...children);\n\n document.body.appendChild(form);\n form.submit();\n}\n"],"names":["RetriableErrorType","RetriableError","Error","type","retriableFetchSDK","method","finalURL","basicAuthHeader","xSDKClientHeader","xSDKParentHostHeader","body","retryCallback","req","baseFetchSDK","err","headers","Authorization","fetchOpts","JSON","stringify","credentials","resp","fetch","e","message","StytchAPIUnreachableError","status","respData","json","data","get","includes","respError","StytchAPISchemaError","StytchAPIError","text","baseSubmitFormSDK","bodyParams","finalBody","__Authorization","children","Object","entries","map","key","value","input","document","createElement","name","form","action","append","appendChild","submit"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchManager.mjs","sources":["../../../../../../core/src/SearchManager.ts"],"sourcesContent":["import { INetworkClient } from './NetworkClient';\nimport { Member, ResponseCommon } from './public';\nimport { IDFPProtectedAuthProvider } from './DFPProtectedAuthProvider';\n\ntype UserSearchData = ResponseCommon & {\n userType: 'new' | 'passwordless' | 'password';\n};\n\nexport type InternalMember = Pick<Member, 'status' | 'name' | 'member_password_id'>;\n\nexport type MemberSearchData = ResponseCommon & { member: InternalMember | null };\n\nexport interface ISearchData {\n searchUser: (email: string) => Promise<UserSearchData>;\n searchMember: (email: string, organization_id: string) => Promise<MemberSearchData>;\n}\n\nexport class SearchDataManager implements ISearchData {\n constructor(\n private _networkClient: INetworkClient,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {}\n\n searchUser(email: string): Promise<UserSearchData> {\n return this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha().then(({ dfp_telemetry_id, captcha_token }) => {\n return this._networkClient.fetchSDK<UserSearchData>({\n url: `/users/search`,\n method: 'POST',\n body: { email, dfp_telemetry_id, captcha_token },\n });\n });\n }\n\n searchMember(email: string, organization_id: string): Promise<MemberSearchData> {\n return this._networkClient.fetchSDK<MemberSearchData>({\n url: `/b2b/organizations/members/search`,\n method: 'POST',\n body: { email_address: email, organization_id },\n });\n }\n}\n"],"names":["SearchDataManager","constructor","dfpProtectedAuth","_networkClient","searchUser","email","getDFPTelemetryIDAndCaptcha","then","dfp_telemetry_id","captcha_token","fetchSDK","url","method","body","searchMember","organization_id","email_address"],"mappings":"AAiBO,MAAMA,iBAAAA,CAAAA;;;AACXC,IAAAA,WAAAA,CACE,cAAsC,EAC9BC,gBAA2C,CACnD;aAFQC,cAAAA,GAAAA,cAAAA;aACAD,gBAAAA,GAAAA,gBAAAA;AACP,IAAA;AAEHE,IAAAA,UAAAA,CAAWC,KAAa,EAA2B;AACjD,QAAA,OAAO,IAAI,CAACH,gBAAgB,CAACI,2BAA2B,EAAA,CAAGC,IAAI,CAAC,CAAC,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAA;AAClG,YAAA,OAAO,IAAI,CAACN,cAAc,CAACO,QAAQ,CAAiB;gBAClDC,GAAAA,EAAK,CAAC,aAAa,CAAC;gBACpBC,MAAAA,EAAQ,MAAA;gBACRC,IAAAA,EAAM;AAAER,oBAAAA,KAAAA;AAAOG,oBAAAA,gBAAAA;AAAkBC,oBAAAA;AAAc;AACjD,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;IAEAK,YAAAA,CAAaT,KAAa,EAAEU,eAAuB,EAA6B;AAC9E,QAAA,OAAO,IAAI,CAACZ,cAAc,CAACO,QAAQ,CAAmB;YACpDC,GAAAA,EAAK,CAAC,iCAAiC,CAAC;YACxCC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM;gBAAEG,aAAAA,EAAeX,KAAAA;AAAOU,gBAAAA;AAAgB;AAChD,SAAA,CAAA;AACF,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"SearchManager.mjs","sources":["../../../../../../core/src/SearchManager.ts"],"sourcesContent":["import { INetworkClient } from './NetworkClient';\nimport { Member, ResponseCommon } from './public';\nimport { IDFPProtectedAuthProvider } from './DFPProtectedAuthProvider';\n\ntype UserSearchData = ResponseCommon & {\n userType: 'new' | 'passwordless' | 'password';\n};\n\nexport type InternalMember = Pick<Member, 'status' | 'name' | 'member_password_id'>;\n\nexport type MemberSearchData = ResponseCommon & { member: InternalMember | null };\n\nexport interface ISearchData {\n searchUser: (email: string) => Promise<UserSearchData>;\n searchMember: (email: string, organization_id: string) => Promise<MemberSearchData>;\n}\n\nexport class SearchDataManager implements ISearchData {\n constructor(\n private _networkClient: INetworkClient,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {}\n\n searchUser(email: string): Promise<UserSearchData> {\n return this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha().then(({ dfp_telemetry_id, captcha_token }) => {\n return this._networkClient.fetchSDK<UserSearchData>({\n url: `/users/search`,\n method: 'POST',\n body: { email, dfp_telemetry_id, captcha_token },\n });\n });\n }\n\n searchMember(email: string, organization_id: string): Promise<MemberSearchData> {\n return this._networkClient.fetchSDK<MemberSearchData>({\n url: `/b2b/organizations/members/search`,\n method: 'POST',\n body: { email_address: email, organization_id },\n });\n }\n}\n"],"names":["SearchDataManager","dfpProtectedAuth","_networkClient","searchUser","email","getDFPTelemetryIDAndCaptcha","then","dfp_telemetry_id","captcha_token","fetchSDK","url","method","body","searchMember","organization_id","email_address"],"mappings":"AAiBO,MAAMA,iBAAAA,CAAAA;;;AACX,IAAA,WAAA,CACE,cAAsC,EAC9BC,gBAA2C,CACnD;aAFQC,cAAAA,GAAAA,cAAAA;aACAD,gBAAAA,GAAAA,gBAAAA;AACP,IAAA;AAEHE,IAAAA,UAAAA,CAAWC,KAAa,EAA2B;AACjD,QAAA,OAAO,IAAI,CAACH,gBAAgB,CAACI,2BAA2B,EAAA,CAAGC,IAAI,CAAC,CAAC,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAA;AAClG,YAAA,OAAO,IAAI,CAACN,cAAc,CAACO,QAAQ,CAAiB;gBAClDC,GAAAA,EAAK,CAAC,aAAa,CAAC;gBACpBC,MAAAA,EAAQ,MAAA;gBACRC,IAAAA,EAAM;AAAER,oBAAAA,KAAAA;AAAOG,oBAAAA,gBAAAA;AAAkBC,oBAAAA;AAAc;AACjD,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;IAEAK,YAAAA,CAAaT,KAAa,EAAEU,eAAuB,EAA6B;AAC9E,QAAA,OAAO,IAAI,CAACZ,cAAc,CAACO,QAAQ,CAAmB;YACpDC,GAAAA,EAAK,CAAC,iCAAiC,CAAC;YACxCC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM;gBAAEG,aAAAA,EAAeX,KAAAA;AAAOU,gBAAAA;AAAgB;AAChD,SAAA,CAAA;AACF,IAAA;AACF;;;;"}
@@ -35,7 +35,7 @@ class SessionManager {
35
35
  static REFRESH_INTERVAL_MS = 1000 * 60 * 3;
36
36
  // When testing - it's often more useful to set to a shorter duration
37
37
  // private static REFRESH_INTERVAL_MS = 1000 * 3;
38
- timeout;
38
+ timeout = null;
39
39
  /** In minutes */ lastAuthenticationSessionDuration;
40
40
  static registry = new SessionManagerRegistry();
41
41
  register() {
@@ -49,34 +49,6 @@ class SessionManager {
49
49
  this._headlessSessionClient = _headlessSessionClient;
50
50
  this._publicToken = _publicToken;
51
51
  this._options = _options;
52
- this.timeout = null;
53
- this._onDataChange = (state)=>{
54
- if (state != null && state.sessionDurationMinutes) {
55
- this.lastAuthenticationSessionDuration = state.sessionDurationMinutes;
56
- }
57
- if (shouldTryRefresh(state)) {
58
- this.scheduleBackgroundRefresh();
59
- } else {
60
- this.cancelBackgroundRefresh();
61
- }
62
- };
63
- this._reauthenticateWithBackoff = async ()=>{
64
- let count = 0;
65
- while(true){
66
- try {
67
- const options = {
68
- session_duration_minutes: this._options.keepSessionAlive ? this.lastAuthenticationSessionDuration : undefined
69
- };
70
- return await this._headlessSessionClient.authenticate(options);
71
- } catch (err) {
72
- if (SessionManager.isUnrecoverableError(err)) {
73
- return Promise.reject(err);
74
- }
75
- count++;
76
- await new Promise((done)=>setTimeout(done, SessionManager.timeoutForAttempt(count)));
77
- }
78
- }
79
- };
80
52
  this._subscriptionService.subscribeToState(this._onDataChange);
81
53
  }
82
54
  /**
@@ -113,12 +85,37 @@ class SessionManager {
113
85
  * - If the user steps up their authentication via another .authenticate call(), we should restart the background worker
114
86
  * - If the user logs out, we should terminate the worker
115
87
  * - We should ignore session changes that we ourselves caused - so if we already have a timeout, leave it be!
116
- */ _onDataChange;
88
+ */ _onDataChange = (state)=>{
89
+ if (state != null && state.sessionDurationMinutes) {
90
+ this.lastAuthenticationSessionDuration = state.sessionDurationMinutes;
91
+ }
92
+ if (shouldTryRefresh(state)) {
93
+ this.scheduleBackgroundRefresh();
94
+ } else {
95
+ this.cancelBackgroundRefresh();
96
+ }
97
+ };
117
98
  // In cases where we cannot get a satisfactory request:
118
99
  // - Stytch is hard-down
119
100
  // - The user's network is disconnected for an extended period of time
120
101
  // we will continue to retry every 4 minutes ad infinum
121
- _reauthenticateWithBackoff;
102
+ _reauthenticateWithBackoff = async ()=>{
103
+ let count = 0;
104
+ while(true){
105
+ try {
106
+ const options = {
107
+ session_duration_minutes: this._options.keepSessionAlive ? this.lastAuthenticationSessionDuration : undefined
108
+ };
109
+ return await this._headlessSessionClient.authenticate(options);
110
+ } catch (err) {
111
+ if (SessionManager.isUnrecoverableError(err)) {
112
+ return Promise.reject(err);
113
+ }
114
+ count++;
115
+ await new Promise((done)=>setTimeout(done, SessionManager.timeoutForAttempt(count)));
116
+ }
117
+ }
118
+ };
122
119
  // We start with a backoff of 2000ms and increase exponentially to ~4 minutes (+/- 175 ms for jitter)
123
120
  // A short backoff initially helps increase the chance that we refresh the session before the JWT expires
124
121
  static timeoutForAttempt(count) {
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.mjs","sources":["../../../../../../core/src/SessionManager.ts"],"sourcesContent":["import { MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING } from './constants';\nimport {\n B2BState,\n ConsumerState,\n IHeadlessB2BSessionClient,\n IHeadlessSessionClient,\n SessionAuthenticateOptions,\n StytchProjectConfigurationInput,\n UNRECOVERABLE_ERROR_TYPES,\n} from './public';\nimport { shouldTryRefresh } from './shouldTryRefresh';\nimport { IB2BSubscriptionService, IConsumerSubscriptionService } from './SubscriptionService';\nimport { logger } from './utils';\nimport { SessionUpdateOptions } from './types';\n\nclass SessionManagerRegistry {\n private hasWarned = false;\n\n private registry = new Map<string, ISessionManager>();\n\n public register(key: string, sessionManager: ISessionManager) {\n const otherManager = this.registry.get(key);\n\n // If there appears to be another registered session manager, issue a\n // warning and cancel its background refresh in favor the newer registration\n if (otherManager && otherManager !== sessionManager) {\n if (!this.hasWarned) {\n logger.warn(MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING);\n this.hasWarned = true;\n }\n otherManager.cancelBackgroundRefresh();\n }\n this.registry.set(key, sessionManager);\n }\n\n public unregister(publicToken: string, sessionManager: ISessionManager) {\n const otherManager = this.registry.get(publicToken);\n if (otherManager && otherManager === sessionManager) {\n this.registry.delete(publicToken);\n }\n }\n}\n\nexport interface ISessionManager {\n performBackgroundRefresh: () => void;\n cancelBackgroundRefresh: () => void;\n}\n\nexport class SessionManager<TProjectConfiguration extends StytchProjectConfigurationInput> implements ISessionManager {\n // Three minutes\n private static REFRESH_INTERVAL_MS = 1000 * 60 * 3;\n // When testing - it's often more useful to set to a shorter duration\n // private static REFRESH_INTERVAL_MS = 1000 * 3;\n\n private timeout: ReturnType<typeof setTimeout> | null = null;\n\n /** In minutes */\n private lastAuthenticationSessionDuration: number | undefined;\n\n private static registry = new SessionManagerRegistry();\n\n private register() {\n SessionManager.registry.register(this._publicToken, this);\n }\n\n private unregister() {\n SessionManager.registry.unregister(this._publicToken, this);\n }\n\n constructor(\n private _subscriptionService:\n | IConsumerSubscriptionService<TProjectConfiguration>\n | IB2BSubscriptionService<TProjectConfiguration>,\n private _headlessSessionClient:\n | IHeadlessSessionClient<TProjectConfiguration>\n | IHeadlessB2BSessionClient<TProjectConfiguration>,\n private _publicToken: string,\n private _options: { keepSessionAlive?: boolean },\n ) {\n this._subscriptionService.subscribeToState(this._onDataChange);\n }\n\n /**\n * The core logic of the session refresh recursive trampoline\n * - Refreshes the currently issued session\n * - Schedules a future refresh if successful\n */\n performBackgroundRefresh() {\n logger.debug('performing background refresh at ', Date.now());\n this._reauthenticateWithBackoff()\n .then(() => {\n this.scheduleBackgroundRefresh();\n })\n .catch((error: unknown) => {\n logger.warn('Session background refresh failed. Signalling to app that user is logged out.', { error });\n this._subscriptionService.destroySession();\n });\n }\n\n private scheduleBackgroundRefresh() {\n /* Highlander rules - there can only ever be one */\n this.cancelBackgroundRefresh();\n this.register();\n logger.debug('Scheduling bg refresh', Date.now());\n this.timeout = setTimeout(() => {\n this.performBackgroundRefresh();\n }, SessionManager.REFRESH_INTERVAL_MS);\n }\n\n cancelBackgroundRefresh() {\n if (this.timeout !== null) {\n this.unregister();\n logger.debug('Cancelling bg refresh', Date.now());\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * We need to listen to a few types of events:\n * - If the user logs in via invoking a .authenticate() call, we should start the background worker\n * - If the user steps up their authentication via another .authenticate call(), we should restart the background worker\n * - If the user logs out, we should terminate the worker\n * - We should ignore session changes that we ourselves caused - so if we already have a timeout, leave it be!\n */\n private _onDataChange = (\n state: (ConsumerState & SessionUpdateOptions) | (B2BState & SessionUpdateOptions) | null,\n ) => {\n if (state != null && state.sessionDurationMinutes) {\n this.lastAuthenticationSessionDuration = state.sessionDurationMinutes;\n }\n\n if (shouldTryRefresh(state)) {\n this.scheduleBackgroundRefresh();\n } else {\n this.cancelBackgroundRefresh();\n }\n };\n\n // In cases where we cannot get a satisfactory request:\n // - Stytch is hard-down\n // - The user's network is disconnected for an extended period of time\n // we will continue to retry every 4 minutes ad infinum\n private _reauthenticateWithBackoff = async () => {\n let count = 0;\n while (true) {\n try {\n const options: SessionAuthenticateOptions = {\n session_duration_minutes: this._options.keepSessionAlive ? this.lastAuthenticationSessionDuration : undefined,\n };\n\n return await this._headlessSessionClient.authenticate(options);\n } catch (err) {\n if (SessionManager.isUnrecoverableError(err)) {\n return Promise.reject(err);\n }\n count++;\n await new Promise((done) => setTimeout(done, SessionManager.timeoutForAttempt(count)));\n }\n }\n };\n\n // We start with a backoff of 2000ms and increase exponentially to ~4 minutes (+/- 175 ms for jitter)\n // A short backoff initially helps increase the chance that we refresh the session before the JWT expires\n static timeoutForAttempt(count: number) {\n count = Math.min(count, 7);\n const jitter = Math.floor(Math.random() * 350) - 175;\n const delayMS = 2000 * 2 ** count;\n return jitter + delayMS;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static isUnrecoverableError(error: any) {\n return UNRECOVERABLE_ERROR_TYPES.includes(error.error_type);\n }\n}\n"],"names":["SessionManagerRegistry","hasWarned","registry","Map","register","key","sessionManager","otherManager","get","logger","warn","MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING","cancelBackgroundRefresh","set","unregister","publicToken","delete","SessionManager","REFRESH_INTERVAL_MS","timeout","lastAuthenticationSessionDuration","_publicToken","constructor","_subscriptionService","_headlessSessionClient","_options","_onDataChange","state","sessionDurationMinutes","shouldTryRefresh","scheduleBackgroundRefresh","_reauthenticateWithBackoff","count","options","session_duration_minutes","keepSessionAlive","undefined","authenticate","err","isUnrecoverableError","Promise","reject","done","setTimeout","timeoutForAttempt","subscribeToState","performBackgroundRefresh","then","catch","error","destroySession","clearTimeout","Math","min","jitter","floor","random","delayMS","UNRECOVERABLE_ERROR_TYPES","includes","error_type"],"mappings":"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"}
1
+ {"version":3,"file":"SessionManager.mjs","sources":["../../../../../../core/src/SessionManager.ts"],"sourcesContent":["import { MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING } from './constants';\nimport {\n B2BState,\n ConsumerState,\n IHeadlessB2BSessionClient,\n IHeadlessSessionClient,\n SessionAuthenticateOptions,\n StytchProjectConfigurationInput,\n UNRECOVERABLE_ERROR_TYPES,\n} from './public';\nimport { shouldTryRefresh } from './shouldTryRefresh';\nimport { IB2BSubscriptionService, IConsumerSubscriptionService } from './SubscriptionService';\nimport { logger } from './utils';\nimport { SessionUpdateOptions } from './types';\n\nclass SessionManagerRegistry {\n private hasWarned = false;\n\n private registry = new Map<string, ISessionManager>();\n\n public register(key: string, sessionManager: ISessionManager) {\n const otherManager = this.registry.get(key);\n\n // If there appears to be another registered session manager, issue a\n // warning and cancel its background refresh in favor the newer registration\n if (otherManager && otherManager !== sessionManager) {\n if (!this.hasWarned) {\n logger.warn(MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING);\n this.hasWarned = true;\n }\n otherManager.cancelBackgroundRefresh();\n }\n this.registry.set(key, sessionManager);\n }\n\n public unregister(publicToken: string, sessionManager: ISessionManager) {\n const otherManager = this.registry.get(publicToken);\n if (otherManager && otherManager === sessionManager) {\n this.registry.delete(publicToken);\n }\n }\n}\n\nexport interface ISessionManager {\n performBackgroundRefresh: () => void;\n cancelBackgroundRefresh: () => void;\n}\n\nexport class SessionManager<TProjectConfiguration extends StytchProjectConfigurationInput> implements ISessionManager {\n // Three minutes\n private static REFRESH_INTERVAL_MS = 1000 * 60 * 3;\n // When testing - it's often more useful to set to a shorter duration\n // private static REFRESH_INTERVAL_MS = 1000 * 3;\n\n private timeout: ReturnType<typeof setTimeout> | null = null;\n\n /** In minutes */\n private lastAuthenticationSessionDuration: number | undefined;\n\n private static registry = new SessionManagerRegistry();\n\n private register() {\n SessionManager.registry.register(this._publicToken, this);\n }\n\n private unregister() {\n SessionManager.registry.unregister(this._publicToken, this);\n }\n\n constructor(\n private _subscriptionService:\n | IConsumerSubscriptionService<TProjectConfiguration>\n | IB2BSubscriptionService<TProjectConfiguration>,\n private _headlessSessionClient:\n | IHeadlessSessionClient<TProjectConfiguration>\n | IHeadlessB2BSessionClient<TProjectConfiguration>,\n private _publicToken: string,\n private _options: { keepSessionAlive?: boolean },\n ) {\n this._subscriptionService.subscribeToState(this._onDataChange);\n }\n\n /**\n * The core logic of the session refresh recursive trampoline\n * - Refreshes the currently issued session\n * - Schedules a future refresh if successful\n */\n performBackgroundRefresh() {\n logger.debug('performing background refresh at ', Date.now());\n this._reauthenticateWithBackoff()\n .then(() => {\n this.scheduleBackgroundRefresh();\n })\n .catch((error: unknown) => {\n logger.warn('Session background refresh failed. Signalling to app that user is logged out.', { error });\n this._subscriptionService.destroySession();\n });\n }\n\n private scheduleBackgroundRefresh() {\n /* Highlander rules - there can only ever be one */\n this.cancelBackgroundRefresh();\n this.register();\n logger.debug('Scheduling bg refresh', Date.now());\n this.timeout = setTimeout(() => {\n this.performBackgroundRefresh();\n }, SessionManager.REFRESH_INTERVAL_MS);\n }\n\n cancelBackgroundRefresh() {\n if (this.timeout !== null) {\n this.unregister();\n logger.debug('Cancelling bg refresh', Date.now());\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * We need to listen to a few types of events:\n * - If the user logs in via invoking a .authenticate() call, we should start the background worker\n * - If the user steps up their authentication via another .authenticate call(), we should restart the background worker\n * - If the user logs out, we should terminate the worker\n * - We should ignore session changes that we ourselves caused - so if we already have a timeout, leave it be!\n */\n private _onDataChange = (\n state: (ConsumerState & SessionUpdateOptions) | (B2BState & SessionUpdateOptions) | null,\n ) => {\n if (state != null && state.sessionDurationMinutes) {\n this.lastAuthenticationSessionDuration = state.sessionDurationMinutes;\n }\n\n if (shouldTryRefresh(state)) {\n this.scheduleBackgroundRefresh();\n } else {\n this.cancelBackgroundRefresh();\n }\n };\n\n // In cases where we cannot get a satisfactory request:\n // - Stytch is hard-down\n // - The user's network is disconnected for an extended period of time\n // we will continue to retry every 4 minutes ad infinum\n private _reauthenticateWithBackoff = async () => {\n let count = 0;\n while (true) {\n try {\n const options: SessionAuthenticateOptions = {\n session_duration_minutes: this._options.keepSessionAlive ? this.lastAuthenticationSessionDuration : undefined,\n };\n\n return await this._headlessSessionClient.authenticate(options);\n } catch (err) {\n if (SessionManager.isUnrecoverableError(err)) {\n return Promise.reject(err);\n }\n count++;\n await new Promise((done) => setTimeout(done, SessionManager.timeoutForAttempt(count)));\n }\n }\n };\n\n // We start with a backoff of 2000ms and increase exponentially to ~4 minutes (+/- 175 ms for jitter)\n // A short backoff initially helps increase the chance that we refresh the session before the JWT expires\n static timeoutForAttempt(count: number) {\n count = Math.min(count, 7);\n const jitter = Math.floor(Math.random() * 350) - 175;\n const delayMS = 2000 * 2 ** count;\n return jitter + delayMS;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static isUnrecoverableError(error: any) {\n return UNRECOVERABLE_ERROR_TYPES.includes(error.error_type);\n }\n}\n"],"names":["SessionManagerRegistry","hasWarned","registry","Map","register","key","sessionManager","otherManager","get","logger","warn","MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING","cancelBackgroundRefresh","set","unregister","publicToken","delete","SessionManager","REFRESH_INTERVAL_MS","timeout","lastAuthenticationSessionDuration","_publicToken","_subscriptionService","_headlessSessionClient","_options","subscribeToState","_onDataChange","performBackgroundRefresh","_reauthenticateWithBackoff","then","scheduleBackgroundRefresh","catch","error","destroySession","setTimeout","clearTimeout","state","sessionDurationMinutes","shouldTryRefresh","count","options","session_duration_minutes","keepSessionAlive","undefined","authenticate","err","isUnrecoverableError","Promise","reject","done","timeoutForAttempt","Math","min","jitter","floor","random","delayMS","UNRECOVERABLE_ERROR_TYPES","includes","error_type"],"mappings":"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"}
@@ -4,13 +4,12 @@ class StateChangeClient {
4
4
  constructor(_subscriptionService, emptyState){
5
5
  this._subscriptionService = _subscriptionService;
6
6
  this.emptyState = emptyState;
7
- this.onStateChange = (callback)=>{
8
- return this._subscriptionService.subscribeToState((state)=>{
9
- callback(state ?? this.emptyState);
10
- });
11
- };
12
7
  }
13
- onStateChange;
8
+ onStateChange = (callback)=>{
9
+ return this._subscriptionService.subscribeToState((state)=>{
10
+ callback(state ?? this.emptyState);
11
+ });
12
+ };
14
13
  }
15
14
 
16
15
  export { StateChangeClient };
@@ -1 +1 @@
1
- {"version":3,"file":"StateChangeClient.mjs","sources":["../../../../../../core/src/StateChangeClient.ts"],"sourcesContent":["import { ISubscriptionService } from './SubscriptionService';\nimport { UnsubscribeFunction } from './public';\nimport { AllowedOpaqueTokens } from './typeConfig';\n\ntype DeepReadonly<T> = {\n readonly [P in keyof T]: DeepReadonly<T[P]>;\n};\n\nexport type StateChangeHandler<T> = (state: DeepReadonly<T>) => void;\nexport type StateChangeRegisterFunction<T> = (callback: StateChangeHandler<T>) => UnsubscribeFunction;\n\nexport class StateChangeClient<T> {\n constructor(\n private readonly _subscriptionService: ISubscriptionService<T | null, AllowedOpaqueTokens>,\n private readonly emptyState: T,\n ) {}\n\n public onStateChange: StateChangeRegisterFunction<T> = (callback) => {\n return this._subscriptionService.subscribeToState((state) => {\n callback(state ?? this.emptyState);\n });\n };\n}\n"],"names":["StateChangeClient","constructor","emptyState","_subscriptionService","onStateChange","callback","subscribeToState","state"],"mappings":"AAWO,MAAMA,iBAAAA,CAAAA;;;AACXC,IAAAA,WAAAA,CACE,oBAA0F,EACzEC,UAAa,CAC9B;aAFiBC,oBAAAA,GAAAA,oBAAAA;aACAD,UAAAA,GAAAA,UAAAA;AAGZE,QAAAA,IAAAA,CAAAA,aAAAA,GAAgD,CAACC,QAAAA,GAAAA;AACtD,YAAA,OAAO,IAAI,CAACF,oBAAoB,CAACG,gBAAgB,CAAC,CAACC,KAAAA,GAAAA;gBACjDF,QAAAA,CAASE,KAAAA,IAAS,IAAI,CAACL,UAAU,CAAA;AACnC,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AANG,IAAA;IAEIE,aAAAA;AAKT;;;;"}
1
+ {"version":3,"file":"StateChangeClient.mjs","sources":["../../../../../../core/src/StateChangeClient.ts"],"sourcesContent":["import { ISubscriptionService } from './SubscriptionService';\nimport { UnsubscribeFunction } from './public';\nimport { AllowedOpaqueTokens } from './typeConfig';\n\ntype DeepReadonly<T> = {\n readonly [P in keyof T]: DeepReadonly<T[P]>;\n};\n\nexport type StateChangeHandler<T> = (state: DeepReadonly<T>) => void;\nexport type StateChangeRegisterFunction<T> = (callback: StateChangeHandler<T>) => UnsubscribeFunction;\n\nexport class StateChangeClient<T> {\n constructor(\n private readonly _subscriptionService: ISubscriptionService<T | null, AllowedOpaqueTokens>,\n private readonly emptyState: T,\n ) {}\n\n public onStateChange: StateChangeRegisterFunction<T> = (callback) => {\n return this._subscriptionService.subscribeToState((state) => {\n callback(state ?? this.emptyState);\n });\n };\n}\n"],"names":["StateChangeClient","emptyState","_subscriptionService","onStateChange","callback","subscribeToState","state"],"mappings":"AAWO,MAAMA,iBAAAA,CAAAA;;;AACX,IAAA,WAAA,CACE,oBAA0F,EACzEC,UAAa,CAC9B;aAFiBC,oBAAAA,GAAAA,oBAAAA;aACAD,UAAAA,GAAAA,UAAAA;AAChB,IAAA;AAEIE,IAAAA,aAAAA,GAAgD,CAACC,QAAAA,GAAAA;AACtD,QAAA,OAAO,IAAI,CAACF,oBAAoB,CAACG,gBAAgB,CAAC,CAACC,KAAAA,GAAAA;YACjDF,QAAAA,CAASE,KAAAA,IAAS,IAAI,CAACL,UAAU,CAAA;AACnC,QAAA,CAAA,CAAA;IACF,CAAA;AACF;;;;"}