@stytch/react 20.0.0-next.4 → 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.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/StytchSSRProxy-Bz6LNYdq.js.map +1 -1
- package/dist/cjs/adminPortal/index.cjs +2 -2
- package/dist/cjs/b2b/index.cjs +11 -8
- package/dist/cjs/b2b/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.headless.cjs +456 -496
- package/dist/cjs/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs/{idpHelpers-Bj_7pbfW.js → idpHelpers-UZaYQqT8.js} +111 -129
- package/dist/cjs/{idpHelpers-Bj_7pbfW.js.map → idpHelpers-UZaYQqT8.js.map} +1 -1
- package/dist/cjs/{index-BIjXBvf_.js → index-MDH3lelI.js} +2 -2
- package/dist/cjs/{index-BIjXBvf_.js.map → index-MDH3lelI.js.map} +1 -1
- package/dist/cjs/index.cjs +18 -14
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.headless.cjs +401 -448
- package/dist/cjs/index.headless.cjs.map +1 -1
- package/dist/cjs/{passwordManagerDisableAutofillProps-DV31RTL_.js → passwordManagerDisableAutofillProps-BzR1GTDj.js} +42 -33
- package/dist/cjs/passwordManagerDisableAutofillProps-BzR1GTDj.js.map +1 -0
- package/dist/cjs/{shadcn-aVU6Lm9q.js → shadcn-BNtf3uZr.js} +7 -6
- package/dist/cjs/shadcn-BNtf3uZr.js.map +1 -0
- package/dist/cjs-dev/adminPortal/index.cjs +2 -2
- package/dist/cjs-dev/b2b/index.cjs +11 -8
- package/dist/cjs-dev/b2b/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.headless.cjs +468 -508
- package/dist/cjs-dev/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/dev-DaCGDI6V.js.map +1 -1
- package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js → idpHelpers-CVk39K69.js} +111 -129
- package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js.map → idpHelpers-CVk39K69.js.map} +1 -1
- package/dist/cjs-dev/{index-rquGmIlv.js → index-BDTK8QN0.js} +2 -2
- package/dist/cjs-dev/{index-rquGmIlv.js.map → index-BDTK8QN0.js.map} +1 -1
- package/dist/cjs-dev/index.cjs +18 -14
- package/dist/cjs-dev/index.cjs.map +1 -1
- package/dist/cjs-dev/index.headless.cjs +405 -452
- package/dist/cjs-dev/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CgiK2M_U.js → passwordManagerDisableAutofillProps--FLcEDiY.js} +42 -33
- package/dist/cjs-dev/passwordManagerDisableAutofillProps--FLcEDiY.js.map +1 -0
- package/dist/cjs-dev/{shadcn-DMk6ZSoD.js → shadcn-CvmoCuzj.js} +9 -8
- package/dist/cjs-dev/shadcn-CvmoCuzj.js.map +1 -0
- package/dist/esm/_virtual/index3.mjs +3 -5
- package/dist/esm/_virtual/index3.mjs.map +1 -1
- package/dist/esm/_virtual/index4.mjs +5 -3
- package/dist/esm/_virtual/index4.mjs.map +1 -1
- package/dist/esm/node_modules/@lingui/react/dist/index.mjs +14 -13
- package/dist/esm/node_modules/@lingui/react/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
- package/dist/esm/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
- package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
- package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
- package/dist/esm/packages/core/src/EventLogger.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +111 -125
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +142 -153
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +81 -93
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +67 -73
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/NetworkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/SearchManager.mjs.map +1 -1
- package/dist/esm/packages/core/src/SessionManager.mjs +28 -31
- package/dist/esm/packages/core/src/SessionManager.mjs.map +1 -1
- package/dist/esm/packages/core/src/StateChangeClient.mjs +5 -6
- package/dist/esm/packages/core/src/StateChangeClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/public/SDKErrors.mjs.map +1 -1
- package/dist/esm/packages/core/src/rbac.mjs.map +1 -1
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/BootstrapDataManager.mjs.map +1 -1
- package/dist/esm/packages/web/src/CaptchaProvider.mjs +10 -11
- package/dist/esm/packages/web/src/CaptchaProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs +4 -8
- package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs +24 -24
- package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/NetworkClient.mjs +4 -5
- package/dist/esm/packages/web/src/NetworkClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/PKCEManager.mjs.map +1 -1
- package/dist/esm/packages/web/src/StytchClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/SubscriptionService.mjs +8 -10
- package/dist/esm/packages/web/src/SubscriptionService.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
- package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
- package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
- package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/App.mjs +3 -1
- package/dist/esm/packages/web/src/ui/b2b/App.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
- package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +4 -2
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
- package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
- package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
- package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
- package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/esm-dev/_virtual/index.mjs +3 -5
- package/dist/esm-dev/_virtual/index.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index2.mjs +5 -3
- package/dist/esm-dev/_virtual/index2.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index3.mjs +5 -3
- package/dist/esm-dev/_virtual/index3.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index4.mjs +3 -5
- package/dist/esm-dev/_virtual/index4.mjs.map +1 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs +14 -13
- package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs.map +1 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
- package/dist/esm-dev/node_modules/swr/core/dist/index.mjs +1 -1
- package/dist/esm-dev/node_modules/swr/infinite/dist/index.mjs +1 -1
- package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
- package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/EventLogger.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +114 -128
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +144 -155
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +88 -100
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +70 -76
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/NetworkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/SearchManager.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/SessionManager.mjs +28 -31
- package/dist/esm-dev/packages/core/src/SessionManager.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/StateChangeClient.mjs +5 -6
- package/dist/esm-dev/packages/core/src/StateChangeClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/public/SDKErrors.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/rbac.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/BootstrapDataManager.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs +10 -11
- package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs +4 -8
- package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs +24 -24
- package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/NetworkClient.mjs +4 -5
- package/dist/esm-dev/packages/web/src/NetworkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/PKCEManager.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/StytchClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/SubscriptionService.mjs +8 -10
- package/dist/esm-dev/packages/web/src/SubscriptionService.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AuthManagementSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/useMemberActivation.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionDangerZoneSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionTokenRotationSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMNewConnectionScreen.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/SSONewConnectionScreen.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateMember.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateOrganization.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateScimConnection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateSsoConnection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRevalidateConnectionList.mjs +1 -1
- package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
- package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
- package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
- package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs +3 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/Container.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +5 -3
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
- package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/types/{PresentationConfig-B2jX85oV.d.ts → PresentationConfig-CdAymT0c.d.ts} +5 -0
- package/dist/types/{StytchB2BClient-D16e_lp1.d.ts → StytchB2BClient-DYF9xGAB.d.ts} +1 -1
- package/dist/types/{StytchClient-BwQdJzdj.d.ts → StytchClient-IyY7-cpI.d.ts} +1 -1
- package/dist/types/adminPortal/index.d.ts +3 -3
- package/dist/types/b2b/index.d.ts +7 -7
- package/dist/types/b2b/index.headless.d.ts +2 -2
- package/dist/types/compat.d.ts +1 -1
- package/dist/types/{createAuthUrlHandler-R1kNNQD_.d.ts → createAuthUrlHandler-CFZ0DGWC.d.ts} +6 -2
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.headless.d.ts +2 -2
- package/dist/types/{shadcn-CGdmyIUF.d.ts → shadcn-USiNERNw.d.ts} +4 -4
- package/messages/en.po +3 -3
- package/package.json +1 -1
- package/dist/cjs/passwordManagerDisableAutofillProps-DV31RTL_.js.map +0 -1
- package/dist/cjs/shadcn-aVU6Lm9q.js.map +0 -1
- package/dist/cjs-dev/passwordManagerDisableAutofillProps-CgiK2M_U.js.map +0 -1
- package/dist/cjs-dev/shadcn-DMk6ZSoD.js.map +0 -1
- package/dist/esm/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PKCEManager.mjs","sources":["../../../../../../web/src/PKCEManager.ts"],"sourcesContent":["import { ISyncPKCEManager, ProofkeyPair } from '@stytch/core';\nimport { B2BSubscriptionDataLayer, ConsumerSubscriptionDataLayer } from './SubscriptionService';\nimport { logger } from '@stytch/core';\n\nconst PKCE_VERIFIER_STORAGE_KEY = 'PKCE_VERIFIER' as const;\n\nfunction toHex(n: number): string {\n let str = n.toString(16);\n if (str.length === 1) {\n str = '0' + str;\n }\n return str;\n}\n\nfunction base64URLEncode(buf: ArrayBuffer) {\n // Convert the ArrayBuffer to string using Uint8 array.\n // btoa takes chars from 0-255 and base64 encodes.\n // Then convert the base64 encoded to base64url encoded.\n // (replace + with -, replace / with _, trim trailing =)\n return btoa(String.fromCharCode.call(null, ...new Uint8Array(buf)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nexport class PKCEManager implements ISyncPKCEManager {\n constructor(\n private _dataLayer: ConsumerSubscriptionDataLayer | B2BSubscriptionDataLayer,\n private namespace: string,\n ) {}\n\n private key() {\n return `${PKCE_VERIFIER_STORAGE_KEY}:${this.namespace}` as const;\n }\n\n async startPKCETransaction(): Promise<ProofkeyPair> {\n const keyPair = await PKCEManager.createProofkeyPair();\n this._dataLayer.setItem(this.key(), JSON.stringify(keyPair));\n return keyPair;\n }\n\n getPKPair(): ProofkeyPair | undefined {\n const serialized = this._dataLayer.getItem(this.key());\n if (serialized === null) {\n return undefined;\n }\n try {\n return JSON.parse(serialized) as ProofkeyPair;\n } catch {\n logger.warn('Found malformed Proof Key pair in localstorage.');\n return undefined;\n }\n }\n\n clearPKPair(): void {\n return this._dataLayer.removeItem(this.key());\n }\n\n static async createProofkeyPair(): Promise<ProofkeyPair> {\n const bytes = new Uint32Array(16);\n window.crypto.getRandomValues(bytes);\n const codeVerifier = Array.from(bytes).map(toHex).join('');\n\n const digest = await window.crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));\n\n return {\n code_challenge: base64URLEncode(digest),\n code_verifier: codeVerifier,\n };\n }\n}\n"],"names":["PKCE_VERIFIER_STORAGE_KEY","toHex","n","str","toString","length","base64URLEncode","buf","btoa","String","fromCharCode","call","Uint8Array","replace","PKCEManager","
|
|
1
|
+
{"version":3,"file":"PKCEManager.mjs","sources":["../../../../../../web/src/PKCEManager.ts"],"sourcesContent":["import { ISyncPKCEManager, ProofkeyPair } from '@stytch/core';\nimport { B2BSubscriptionDataLayer, ConsumerSubscriptionDataLayer } from './SubscriptionService';\nimport { logger } from '@stytch/core';\n\nconst PKCE_VERIFIER_STORAGE_KEY = 'PKCE_VERIFIER' as const;\n\nfunction toHex(n: number): string {\n let str = n.toString(16);\n if (str.length === 1) {\n str = '0' + str;\n }\n return str;\n}\n\nfunction base64URLEncode(buf: ArrayBuffer) {\n // Convert the ArrayBuffer to string using Uint8 array.\n // btoa takes chars from 0-255 and base64 encodes.\n // Then convert the base64 encoded to base64url encoded.\n // (replace + with -, replace / with _, trim trailing =)\n return btoa(String.fromCharCode.call(null, ...new Uint8Array(buf)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nexport class PKCEManager implements ISyncPKCEManager {\n constructor(\n private _dataLayer: ConsumerSubscriptionDataLayer | B2BSubscriptionDataLayer,\n private namespace: string,\n ) {}\n\n private key() {\n return `${PKCE_VERIFIER_STORAGE_KEY}:${this.namespace}` as const;\n }\n\n async startPKCETransaction(): Promise<ProofkeyPair> {\n const keyPair = await PKCEManager.createProofkeyPair();\n this._dataLayer.setItem(this.key(), JSON.stringify(keyPair));\n return keyPair;\n }\n\n getPKPair(): ProofkeyPair | undefined {\n const serialized = this._dataLayer.getItem(this.key());\n if (serialized === null) {\n return undefined;\n }\n try {\n return JSON.parse(serialized) as ProofkeyPair;\n } catch {\n logger.warn('Found malformed Proof Key pair in localstorage.');\n return undefined;\n }\n }\n\n clearPKPair(): void {\n return this._dataLayer.removeItem(this.key());\n }\n\n static async createProofkeyPair(): Promise<ProofkeyPair> {\n const bytes = new Uint32Array(16);\n window.crypto.getRandomValues(bytes);\n const codeVerifier = Array.from(bytes).map(toHex).join('');\n\n const digest = await window.crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));\n\n return {\n code_challenge: base64URLEncode(digest),\n code_verifier: codeVerifier,\n };\n }\n}\n"],"names":["PKCE_VERIFIER_STORAGE_KEY","toHex","n","str","toString","length","base64URLEncode","buf","btoa","String","fromCharCode","call","Uint8Array","replace","PKCEManager","namespace","_dataLayer","key","startPKCETransaction","keyPair","createProofkeyPair","setItem","JSON","stringify","getPKPair","serialized","getItem","undefined","parse","logger","warn","clearPKPair","removeItem","bytes","Uint32Array","window","crypto","getRandomValues","codeVerifier","Array","from","map","join","digest","subtle","TextEncoder","encode","code_challenge","code_verifier"],"mappings":";;AAIA,MAAMA,yBAAAA,GAA4B,eAAA;AAElC,SAASC,MAAMC,CAAS,EAAA;IACtB,IAAIC,GAAAA,GAAMD,CAAAA,CAAEE,QAAQ,CAAC,EAAA,CAAA;IACrB,IAAID,GAAAA,CAAIE,MAAM,KAAK,CAAA,EAAG;AACpBF,QAAAA,GAAAA,GAAM,GAAA,GAAMA,GAAAA;AACd,IAAA;IACA,OAAOA,GAAAA;AACT;AAEA,SAASG,gBAAgBC,GAAgB,EAAA;;;;;IAKvC,OAAOC,IAAAA,CAAKC,OAAOC,YAAY,CAACC,IAAI,CAAC,IAAA,EAAA,GAAS,IAAIC,UAAAA,CAAWL,GAAAA,CAAAA,CAAAA,CAAAA,CAC1DM,OAAO,CAAC,KAAA,EAAO,KACfA,OAAO,CAAC,OAAO,GAAA,CAAA,CACfA,OAAO,CAAC,KAAA,EAAO,EAAA,CAAA;AACpB;AAEO,MAAMC,WAAAA,CAAAA;;;AACX,IAAA,WAAA,CACE,UAA4E,EACpEC,SAAiB,CACzB;aAFQC,UAAAA,GAAAA,UAAAA;aACAD,SAAAA,GAAAA,SAAAA;AACP,IAAA;IAEKE,GAAAA,GAAM;AACZ,QAAA,OAAO,GAAGjB,yBAAAA,CAA0B,CAAC,EAAE,IAAI,CAACe,SAAS,CAAA,CAAE;AACzD,IAAA;AAEA,IAAA,MAAMG,oBAAAA,GAA8C;QAClD,MAAMC,OAAAA,GAAU,MAAML,WAAAA,CAAYM,kBAAkB,EAAA;QACpD,IAAI,CAACJ,UAAU,CAACK,OAAO,CAAC,IAAI,CAACJ,GAAG,EAAA,EAAIK,IAAAA,CAAKC,SAAS,CAACJ,OAAAA,CAAAA,CAAAA;QACnD,OAAOA,OAAAA;AACT,IAAA;IAEAK,SAAAA,GAAsC;QACpC,MAAMC,UAAAA,GAAa,IAAI,CAACT,UAAU,CAACU,OAAO,CAAC,IAAI,CAACT,GAAG,EAAA,CAAA;AACnD,QAAA,IAAIQ,eAAe,IAAA,EAAM;YACvB,OAAOE,SAAAA;AACT,QAAA;QACA,IAAI;YACF,OAAOL,IAAAA,CAAKM,KAAK,CAACH,UAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAM;AACNI,YAAAA,MAAAA,CAAOC,IAAI,CAAC,iDAAA,CAAA;YACZ,OAAOH,SAAAA;AACT,QAAA;AACF,IAAA;IAEAI,WAAAA,GAAoB;QAClB,OAAO,IAAI,CAACf,UAAU,CAACgB,UAAU,CAAC,IAAI,CAACf,GAAG,EAAA,CAAA;AAC5C,IAAA;AAEA,IAAA,aAAaG,kBAAAA,GAA4C;QACvD,MAAMa,KAAAA,GAAQ,IAAIC,WAAAA,CAAY,EAAA,CAAA;QAC9BC,MAAAA,CAAOC,MAAM,CAACC,eAAe,CAACJ,KAAAA,CAAAA;QAC9B,MAAMK,YAAAA,GAAeC,MAAMC,IAAI,CAACP,OAAOQ,GAAG,CAACxC,KAAAA,CAAAA,CAAOyC,IAAI,CAAC,EAAA,CAAA;AAEvD,QAAA,MAAMC,MAAAA,GAAS,MAAMR,MAAAA,CAAOC,MAAM,CAACQ,MAAM,CAACD,MAAM,CAAC,SAAA,EAAW,IAAIE,WAAAA,EAAAA,CAAcC,MAAM,CAACR,YAAAA,CAAAA,CAAAA;QAErF,OAAO;AACLS,YAAAA,cAAAA,EAAgBzC,eAAAA,CAAgBqC,MAAAA,CAAAA;YAChCK,aAAAA,EAAeV;AACjB,SAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StytchClient.mjs","sources":["../../../../../../web/src/StytchClient.ts"],"sourcesContent":["import {\n checkNotSSR,\n checkPublicToken,\n DFPProtectedAuthProvider,\n HeadlessCryptoWalletClient,\n HeadlessMagicLinksClient,\n HeadlessOTPClient,\n HeadlessPasswordClient,\n HeadlessImpersonationClient,\n HeadlessSessionClient,\n HeadlessTOTPClient,\n HeadlessUserClient,\n HeadlessWebAuthnClient,\n INetworkClient,\n SearchDataManager,\n SessionManager,\n StateChangeClient,\n StateChangeRegisterFunction,\n VERTICAL_B2B,\n logger,\n HeadlessRBACClient,\n HeadlessIDPClient,\n} from '@stytch/core';\nimport {\n ConsumerState,\n IHeadlessCryptoWalletClient,\n IHeadlessMagicLinksClient,\n IHeadlessOTPsClient,\n IHeadlessPasswordClient,\n IHeadlessSessionClient,\n IHeadlessTOTPClient,\n IHeadlessUserClient,\n IHeadlessWebAuthnClient,\n IHeadlessImpersonationClient,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n IHeadlessRBACClient,\n} from '@stytch/core/public';\nimport { BootstrapDataManager } from './BootstrapDataManager';\nimport { CaptchaProvider } from './CaptchaProvider';\nimport { ClientsideServicesProvider } from './ClientsideServicesProvider';\nimport { HeadlessOAuthClient, IWebOAuthClient } from './HeadlessOAuthClient';\nimport { NetworkClient } from './NetworkClient';\nimport { OneTapProvider } from './oneTap/OneTapProvider';\nimport { PKCEManager } from './PKCEManager';\nimport {\n ConsumerSubscriptionDataLayer,\n ConsumerSubscriptionService,\n getConsumerDataLayer,\n} from './SubscriptionService';\nimport { writeB2CInternals } from './utils/internal';\nimport { buildFinalConfig, hasCustomApiEndpoint } from './utils/config';\nimport { createAuthUrlHandler, AuthenticateByUrl, ParseAuthenticateUrl } from './utils/createAuthUrlHandler';\n\nexport type HandledTokenType = 'magic_links' | 'oauth' | 'impersonation';\n\n/**\n * A headless client used for invoking the Stytch API.\n * The Stytch Headless Client can be used as a drop-in solution for authentication and session management.\n * Full documentation can be found {@link https://stytch.com/docs/sdks/javascript-sdk online}.\n * @example\n * const stytch = new StytchClient('public-token-<find yours in the stytch dashboard>');\n * stytch.magicLinks.email.loginOrCreate('sandbox@stytch.com', {\n * login_magic_link_url: 'https://example.com/authenticate',\n * login_expiration_minutes: 60,\n * signup_magic_link_url: 'https://example.com/authenticate',\n * signup_expiration_minutes: 60,\n * });\n */\nexport class StytchClient<\n TProjectConfiguration extends StytchProjectConfigurationInput = Stytch.DefaultProjectConfiguration,\n> {\n private readonly _subscriptionService: ConsumerSubscriptionService<TProjectConfiguration>;\n private readonly _sessionManager: SessionManager<TProjectConfiguration>;\n private readonly _networkClient: INetworkClient;\n private readonly _dataLayer: ConsumerSubscriptionDataLayer;\n private readonly _stateChangeClient: StateChangeClient<ConsumerState>;\n\n // External API Clients\n user: IHeadlessUserClient;\n magicLinks: IHeadlessMagicLinksClient<TProjectConfiguration>;\n session: IHeadlessSessionClient<TProjectConfiguration>;\n otps: IHeadlessOTPsClient<TProjectConfiguration>;\n oauth: IWebOAuthClient<TProjectConfiguration>;\n cryptoWallets: IHeadlessCryptoWalletClient<TProjectConfiguration>;\n totps: IHeadlessTOTPClient<TProjectConfiguration>;\n webauthn: IHeadlessWebAuthnClient<TProjectConfiguration>;\n passwords: IHeadlessPasswordClient<TProjectConfiguration>;\n impersonation: IHeadlessImpersonationClient<TProjectConfiguration>;\n rbac: IHeadlessRBACClient;\n idp: HeadlessIDPClient;\n\n // External methods\n /**\n * Register a callback function to be invoked whenever certain state changes\n * occur, like a user or session object being updated.\n *\n * This is an alternative to more specific methods like `user.onChange` and\n * `session.onChange`. It can be helpful if you want to be notified of related\n * changes to different parts of state at once.\n *\n * If you are only interested in specific state changes, consider using more\n * specific methods like `user.onChange` and `session.onChange` instead.\n */\n onStateChange: StateChangeRegisterFunction<ConsumerState>;\n\n /**\n * Extracts token and token type from the current page URL's query parameters.\n * If the current URL do not have the required query params, this will return null.\n * Otherwise, returns an object { handled: boolean, tokenType: string, token: string }\n */\n parseAuthenticateUrl: ParseAuthenticateUrl<HandledTokenType>;\n\n /**\n * Call this method to authenticate the user when the user has been redirected\n * to this page with a token in the query parameters, such as after OAuth\n * or through an email magic link. This method currently supports\n *\n * - Magic links\n * - OAuth\n * - Impersonation\n *\n * Returns null if token or stytch_token_type query parameters are not present,\n * or returns an unhandled result if the token type is not recognized.\n */\n authenticateByUrl: AuthenticateByUrl<HandledTokenType>;\n\n constructor(publicTokenRaw: string, options?: StytchClientOptions) {\n checkNotSSR();\n\n // Intentionally check the raw public token so that we can log a correct error message,\n // but then coalesce to an empty string so that the UI components don't fail to render.\n checkPublicToken(publicTokenRaw);\n const _PUBLIC_TOKEN = publicTokenRaw ?? '';\n\n // Not casting to InternalStytchClientOptions since InternalStytchClientOptions is currently a superset\n const config = buildFinalConfig(this.constructor.name, options);\n const usingCustomApiEndpoint = hasCustomApiEndpoint(_PUBLIC_TOKEN, options);\n\n this._dataLayer = getConsumerDataLayer(_PUBLIC_TOKEN, config);\n this._subscriptionService = new ConsumerSubscriptionService(_PUBLIC_TOKEN, this._dataLayer, {\n usingCustomApiEndpoint,\n });\n this._stateChangeClient = new StateChangeClient(this._subscriptionService, {});\n this.onStateChange = (...args) => this._stateChangeClient.onStateChange(...args);\n\n const additionalTelemetryDataFn = () => ({\n stytch_user_id: this._dataLayer.state?.user?.user_id,\n stytch_session_id: this._dataLayer.state?.session?.session_id,\n });\n\n const passwordsPKCEManager = new PKCEManager(this._dataLayer, 'passwords');\n const networkClient = new NetworkClient(\n _PUBLIC_TOKEN,\n this._dataLayer,\n config.endpoints.liveAPIURL,\n config.endpoints.testAPIURL,\n additionalTelemetryDataFn,\n );\n this._networkClient = networkClient;\n\n const bootstrap = new BootstrapDataManager(_PUBLIC_TOKEN, this._networkClient, this._dataLayer);\n const captcha = new CaptchaProvider(bootstrap.getAsync());\n const dfpProtectedAuth = new DFPProtectedAuthProvider(\n _PUBLIC_TOKEN,\n config.endpoints.dfpBackendURL,\n config.endpoints.dfpCdnURL,\n bootstrap.getAsync(),\n captcha.executeRecaptcha,\n );\n const clientsideServices = new ClientsideServicesProvider(config.endpoints.clientsideServicesIframeURL);\n const oneTap = new OneTapProvider(_PUBLIC_TOKEN, clientsideServices);\n const searchManager = new SearchDataManager(this._networkClient, dfpProtectedAuth);\n\n this.user = new HeadlessUserClient(this._networkClient, this._subscriptionService);\n this.session = new HeadlessSessionClient(this._networkClient, this._subscriptionService);\n this.magicLinks = new HeadlessMagicLinksClient(\n this._networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'magic_links'),\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.otps = new HeadlessOTPClient(\n this._networkClient,\n this._subscriptionService,\n captcha.executeRecaptcha,\n dfpProtectedAuth,\n );\n this.oauth = new HeadlessOAuthClient(\n this._networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'oauth'),\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n oneTap,\n );\n this.cryptoWallets = new HeadlessCryptoWalletClient(\n this._networkClient,\n this._networkClient,\n this._subscriptionService,\n captcha.executeRecaptcha,\n dfpProtectedAuth,\n bootstrap.getAsync(),\n );\n this.totps = new HeadlessTOTPClient(this._networkClient, this._subscriptionService, dfpProtectedAuth);\n this.webauthn = new HeadlessWebAuthnClient(this._networkClient, this._subscriptionService, dfpProtectedAuth);\n this.passwords = new HeadlessPasswordClient(\n this._networkClient,\n this._subscriptionService,\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.impersonation = new HeadlessImpersonationClient(\n this._networkClient,\n this._subscriptionService,\n dfpProtectedAuth,\n );\n\n this.rbac = new HeadlessRBACClient(bootstrap.getSync(), bootstrap.getAsync(), this._subscriptionService);\n this.idp = new HeadlessIDPClient(this._networkClient);\n this._sessionManager = new SessionManager(this._subscriptionService, this.session, _PUBLIC_TOKEN, {\n keepSessionAlive: config.keepSessionAlive,\n });\n\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call.\n // If a custom API endpoint is being used, the session may be being managed by\n // HttpOnly cookies, which we can't detect.\n if (usingCustomApiEndpoint || this._dataLayer.readSessionCookie().session_token) {\n this._sessionManager.performBackgroundRefresh();\n }\n\n this._networkClient.logEvent({\n name: 'sdk_instance_instantiated',\n details: {\n event_callback_registered: false,\n error_callback_registered: false,\n success_callback_registered: false,\n },\n });\n\n bootstrap.getAsync().then((bootstrapData) => {\n if (bootstrapData.vertical === VERTICAL_B2B) {\n logger.error(\n 'This application is using a Stytch client for Consumer projects, but the public token is for a Stytch B2B project. Use a B2B Stytch client instead, or verify that the public token is correct.',\n );\n }\n });\n\n const { authenticateByUrl, parseAuthenticateUrl } = createAuthUrlHandler({\n magic_links: (token, options) => this.magicLinks.authenticate(token, options),\n oauth: (token, options) => this.oauth.authenticate(token, options),\n impersonation: (token: string) => this.impersonation.authenticate({ impersonation_token: token }),\n });\n\n this.authenticateByUrl = authenticateByUrl;\n this.parseAuthenticateUrl = parseAuthenticateUrl;\n\n writeB2CInternals(this, {\n bootstrap,\n clientsideServices,\n captcha,\n oneTap,\n searchManager,\n publicToken: _PUBLIC_TOKEN,\n dataLayer: this._dataLayer,\n networkClient: this._networkClient,\n });\n }\n}\n"],"names":["StytchClient","_subscriptionService","_sessionManager","_networkClient","_dataLayer","_stateChangeClient","user","magicLinks","session","otps","oauth","cryptoWallets","totps","webauthn","passwords","impersonation","rbac","idp","onStateChange","parseAuthenticateUrl","authenticateByUrl","constructor","publicTokenRaw","options","checkNotSSR","checkPublicToken","_PUBLIC_TOKEN","config","buildFinalConfig","name","usingCustomApiEndpoint","hasCustomApiEndpoint","getConsumerDataLayer","ConsumerSubscriptionService","StateChangeClient","args","additionalTelemetryDataFn","stytch_user_id","state","user_id","stytch_session_id","session_id","passwordsPKCEManager","PKCEManager","networkClient","NetworkClient","endpoints","liveAPIURL","testAPIURL","bootstrap","BootstrapDataManager","captcha","CaptchaProvider","getAsync","dfpProtectedAuth","DFPProtectedAuthProvider","dfpBackendURL","dfpCdnURL","executeRecaptcha","clientsideServices","ClientsideServicesProvider","clientsideServicesIframeURL","oneTap","OneTapProvider","searchManager","SearchDataManager","HeadlessUserClient","HeadlessSessionClient","HeadlessMagicLinksClient","HeadlessOTPClient","HeadlessOAuthClient","publicToken","HeadlessCryptoWalletClient","HeadlessTOTPClient","HeadlessWebAuthnClient","HeadlessPasswordClient","HeadlessImpersonationClient","HeadlessRBACClient","getSync","HeadlessIDPClient","SessionManager","keepSessionAlive","readSessionCookie","session_token","performBackgroundRefresh","logEvent","details","event_callback_registered","error_callback_registered","success_callback_registered","then","bootstrapData","vertical","VERTICAL_B2B","logger","error","createAuthUrlHandler","magic_links","token","authenticate","impersonation_token","writeB2CInternals","dataLayer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StytchClient.mjs","sources":["../../../../../../web/src/StytchClient.ts"],"sourcesContent":["import {\n checkNotSSR,\n checkPublicToken,\n DFPProtectedAuthProvider,\n HeadlessCryptoWalletClient,\n HeadlessMagicLinksClient,\n HeadlessOTPClient,\n HeadlessPasswordClient,\n HeadlessImpersonationClient,\n HeadlessSessionClient,\n HeadlessTOTPClient,\n HeadlessUserClient,\n HeadlessWebAuthnClient,\n INetworkClient,\n SearchDataManager,\n SessionManager,\n StateChangeClient,\n StateChangeRegisterFunction,\n VERTICAL_B2B,\n logger,\n HeadlessRBACClient,\n HeadlessIDPClient,\n} from '@stytch/core';\nimport {\n ConsumerState,\n IHeadlessCryptoWalletClient,\n IHeadlessMagicLinksClient,\n IHeadlessOTPsClient,\n IHeadlessPasswordClient,\n IHeadlessSessionClient,\n IHeadlessTOTPClient,\n IHeadlessUserClient,\n IHeadlessWebAuthnClient,\n IHeadlessImpersonationClient,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n IHeadlessRBACClient,\n} from '@stytch/core/public';\nimport { BootstrapDataManager } from './BootstrapDataManager';\nimport { CaptchaProvider } from './CaptchaProvider';\nimport { ClientsideServicesProvider } from './ClientsideServicesProvider';\nimport { HeadlessOAuthClient, IWebOAuthClient } from './HeadlessOAuthClient';\nimport { NetworkClient } from './NetworkClient';\nimport { OneTapProvider } from './oneTap/OneTapProvider';\nimport { PKCEManager } from './PKCEManager';\nimport {\n ConsumerSubscriptionDataLayer,\n ConsumerSubscriptionService,\n getConsumerDataLayer,\n} from './SubscriptionService';\nimport { writeB2CInternals } from './utils/internal';\nimport { buildFinalConfig, hasCustomApiEndpoint } from './utils/config';\nimport { createAuthUrlHandler, AuthenticateByUrl, ParseAuthenticateUrl } from './utils/createAuthUrlHandler';\n\nexport type HandledTokenType = 'magic_links' | 'oauth' | 'impersonation';\n\n/**\n * A headless client used for invoking the Stytch API.\n * The Stytch Headless Client can be used as a drop-in solution for authentication and session management.\n * Full documentation can be found {@link https://stytch.com/docs/sdks/javascript-sdk online}.\n * @example\n * const stytch = new StytchClient('public-token-<find yours in the stytch dashboard>');\n * stytch.magicLinks.email.loginOrCreate('sandbox@stytch.com', {\n * login_magic_link_url: 'https://example.com/authenticate',\n * login_expiration_minutes: 60,\n * signup_magic_link_url: 'https://example.com/authenticate',\n * signup_expiration_minutes: 60,\n * });\n */\nexport class StytchClient<\n TProjectConfiguration extends StytchProjectConfigurationInput = Stytch.DefaultProjectConfiguration,\n> {\n private readonly _subscriptionService: ConsumerSubscriptionService<TProjectConfiguration>;\n private readonly _sessionManager: SessionManager<TProjectConfiguration>;\n private readonly _networkClient: INetworkClient;\n private readonly _dataLayer: ConsumerSubscriptionDataLayer;\n private readonly _stateChangeClient: StateChangeClient<ConsumerState>;\n\n // External API Clients\n user: IHeadlessUserClient;\n magicLinks: IHeadlessMagicLinksClient<TProjectConfiguration>;\n session: IHeadlessSessionClient<TProjectConfiguration>;\n otps: IHeadlessOTPsClient<TProjectConfiguration>;\n oauth: IWebOAuthClient<TProjectConfiguration>;\n cryptoWallets: IHeadlessCryptoWalletClient<TProjectConfiguration>;\n totps: IHeadlessTOTPClient<TProjectConfiguration>;\n webauthn: IHeadlessWebAuthnClient<TProjectConfiguration>;\n passwords: IHeadlessPasswordClient<TProjectConfiguration>;\n impersonation: IHeadlessImpersonationClient<TProjectConfiguration>;\n rbac: IHeadlessRBACClient;\n idp: HeadlessIDPClient;\n\n // External methods\n /**\n * Register a callback function to be invoked whenever certain state changes\n * occur, like a user or session object being updated.\n *\n * This is an alternative to more specific methods like `user.onChange` and\n * `session.onChange`. It can be helpful if you want to be notified of related\n * changes to different parts of state at once.\n *\n * If you are only interested in specific state changes, consider using more\n * specific methods like `user.onChange` and `session.onChange` instead.\n */\n onStateChange: StateChangeRegisterFunction<ConsumerState>;\n\n /**\n * Extracts token and token type from the current page URL's query parameters.\n * If the current URL do not have the required query params, this will return null.\n * Otherwise, returns an object { handled: boolean, tokenType: string, token: string }\n */\n parseAuthenticateUrl: ParseAuthenticateUrl<HandledTokenType>;\n\n /**\n * Call this method to authenticate the user when the user has been redirected\n * to this page with a token in the query parameters, such as after OAuth\n * or through an email magic link. This method currently supports\n *\n * - Magic links\n * - OAuth\n * - Impersonation\n *\n * Returns null if token or stytch_token_type query parameters are not present,\n * or returns an unhandled result if the token type is not recognized.\n */\n authenticateByUrl: AuthenticateByUrl<HandledTokenType>;\n\n constructor(publicTokenRaw: string, options?: StytchClientOptions) {\n checkNotSSR();\n\n // Intentionally check the raw public token so that we can log a correct error message,\n // but then coalesce to an empty string so that the UI components don't fail to render.\n checkPublicToken(publicTokenRaw);\n const _PUBLIC_TOKEN = publicTokenRaw ?? '';\n\n // Not casting to InternalStytchClientOptions since InternalStytchClientOptions is currently a superset\n const config = buildFinalConfig(this.constructor.name, options);\n const usingCustomApiEndpoint = hasCustomApiEndpoint(_PUBLIC_TOKEN, options);\n\n this._dataLayer = getConsumerDataLayer(_PUBLIC_TOKEN, config);\n this._subscriptionService = new ConsumerSubscriptionService(_PUBLIC_TOKEN, this._dataLayer, {\n usingCustomApiEndpoint,\n });\n this._stateChangeClient = new StateChangeClient(this._subscriptionService, {});\n this.onStateChange = (...args) => this._stateChangeClient.onStateChange(...args);\n\n const additionalTelemetryDataFn = () => ({\n stytch_user_id: this._dataLayer.state?.user?.user_id,\n stytch_session_id: this._dataLayer.state?.session?.session_id,\n });\n\n const passwordsPKCEManager = new PKCEManager(this._dataLayer, 'passwords');\n const networkClient = new NetworkClient(\n _PUBLIC_TOKEN,\n this._dataLayer,\n config.endpoints.liveAPIURL,\n config.endpoints.testAPIURL,\n additionalTelemetryDataFn,\n );\n this._networkClient = networkClient;\n\n const bootstrap = new BootstrapDataManager(_PUBLIC_TOKEN, this._networkClient, this._dataLayer);\n const captcha = new CaptchaProvider(bootstrap.getAsync());\n const dfpProtectedAuth = new DFPProtectedAuthProvider(\n _PUBLIC_TOKEN,\n config.endpoints.dfpBackendURL,\n config.endpoints.dfpCdnURL,\n bootstrap.getAsync(),\n captcha.executeRecaptcha,\n );\n const clientsideServices = new ClientsideServicesProvider(config.endpoints.clientsideServicesIframeURL);\n const oneTap = new OneTapProvider(_PUBLIC_TOKEN, clientsideServices);\n const searchManager = new SearchDataManager(this._networkClient, dfpProtectedAuth);\n\n this.user = new HeadlessUserClient(this._networkClient, this._subscriptionService);\n this.session = new HeadlessSessionClient(this._networkClient, this._subscriptionService);\n this.magicLinks = new HeadlessMagicLinksClient(\n this._networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'magic_links'),\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.otps = new HeadlessOTPClient(\n this._networkClient,\n this._subscriptionService,\n captcha.executeRecaptcha,\n dfpProtectedAuth,\n );\n this.oauth = new HeadlessOAuthClient(\n this._networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'oauth'),\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n oneTap,\n );\n this.cryptoWallets = new HeadlessCryptoWalletClient(\n this._networkClient,\n this._networkClient,\n this._subscriptionService,\n captcha.executeRecaptcha,\n dfpProtectedAuth,\n bootstrap.getAsync(),\n );\n this.totps = new HeadlessTOTPClient(this._networkClient, this._subscriptionService, dfpProtectedAuth);\n this.webauthn = new HeadlessWebAuthnClient(this._networkClient, this._subscriptionService, dfpProtectedAuth);\n this.passwords = new HeadlessPasswordClient(\n this._networkClient,\n this._subscriptionService,\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.impersonation = new HeadlessImpersonationClient(\n this._networkClient,\n this._subscriptionService,\n dfpProtectedAuth,\n );\n\n this.rbac = new HeadlessRBACClient(bootstrap.getSync(), bootstrap.getAsync(), this._subscriptionService);\n this.idp = new HeadlessIDPClient(this._networkClient);\n this._sessionManager = new SessionManager(this._subscriptionService, this.session, _PUBLIC_TOKEN, {\n keepSessionAlive: config.keepSessionAlive,\n });\n\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call.\n // If a custom API endpoint is being used, the session may be being managed by\n // HttpOnly cookies, which we can't detect.\n if (usingCustomApiEndpoint || this._dataLayer.readSessionCookie().session_token) {\n this._sessionManager.performBackgroundRefresh();\n }\n\n this._networkClient.logEvent({\n name: 'sdk_instance_instantiated',\n details: {\n event_callback_registered: false,\n error_callback_registered: false,\n success_callback_registered: false,\n },\n });\n\n bootstrap.getAsync().then((bootstrapData) => {\n if (bootstrapData.vertical === VERTICAL_B2B) {\n logger.error(\n 'This application is using a Stytch client for Consumer projects, but the public token is for a Stytch B2B project. Use a B2B Stytch client instead, or verify that the public token is correct.',\n );\n }\n });\n\n const { authenticateByUrl, parseAuthenticateUrl } = createAuthUrlHandler({\n magic_links: (token, options) => this.magicLinks.authenticate(token, options),\n oauth: (token, options) => this.oauth.authenticate(token, options),\n impersonation: (token: string) => this.impersonation.authenticate({ impersonation_token: token }),\n });\n\n this.authenticateByUrl = authenticateByUrl;\n this.parseAuthenticateUrl = parseAuthenticateUrl;\n\n writeB2CInternals(this, {\n bootstrap,\n clientsideServices,\n captcha,\n oneTap,\n searchManager,\n publicToken: _PUBLIC_TOKEN,\n dataLayer: this._dataLayer,\n networkClient: this._networkClient,\n });\n }\n}\n"],"names":["StytchClient","_subscriptionService","_sessionManager","_networkClient","_dataLayer","_stateChangeClient","user","magicLinks","session","otps","oauth","cryptoWallets","totps","webauthn","passwords","impersonation","rbac","idp","onStateChange","parseAuthenticateUrl","authenticateByUrl","publicTokenRaw","options","checkNotSSR","checkPublicToken","_PUBLIC_TOKEN","config","buildFinalConfig","name","usingCustomApiEndpoint","hasCustomApiEndpoint","getConsumerDataLayer","ConsumerSubscriptionService","StateChangeClient","args","additionalTelemetryDataFn","stytch_user_id","state","user_id","stytch_session_id","session_id","passwordsPKCEManager","PKCEManager","networkClient","NetworkClient","endpoints","liveAPIURL","testAPIURL","bootstrap","BootstrapDataManager","captcha","CaptchaProvider","getAsync","dfpProtectedAuth","DFPProtectedAuthProvider","dfpBackendURL","dfpCdnURL","executeRecaptcha","clientsideServices","ClientsideServicesProvider","clientsideServicesIframeURL","oneTap","OneTapProvider","searchManager","SearchDataManager","HeadlessUserClient","HeadlessSessionClient","HeadlessMagicLinksClient","HeadlessOTPClient","HeadlessOAuthClient","publicToken","HeadlessCryptoWalletClient","HeadlessTOTPClient","HeadlessWebAuthnClient","HeadlessPasswordClient","HeadlessImpersonationClient","HeadlessRBACClient","getSync","HeadlessIDPClient","SessionManager","keepSessionAlive","readSessionCookie","session_token","performBackgroundRefresh","logEvent","details","event_callback_registered","error_callback_registered","success_callback_registered","then","bootstrapData","vertical","VERTICAL_B2B","logger","error","createAuthUrlHandler","magic_links","token","authenticate","impersonation_token","writeB2CInternals","dataLayer"],"mappings":"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"}
|
|
@@ -292,18 +292,10 @@ class BaseSubscriptionService {
|
|
|
292
292
|
_datalayer;
|
|
293
293
|
/**
|
|
294
294
|
* Whether the state was retrieved from the cache and is awaiting a refresh
|
|
295
|
-
*/ fromCache;
|
|
295
|
+
*/ fromCache = true;
|
|
296
296
|
constructor(_publicToken, _datalayer, { usingCustomApiEndpoint }){
|
|
297
297
|
this._publicToken = _publicToken;
|
|
298
298
|
this._datalayer = _datalayer;
|
|
299
|
-
this.fromCache = true;
|
|
300
|
-
this._listen = (e)=>{
|
|
301
|
-
if (e.key !== getPersistentStorageKey(this._publicToken, '')) {
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
const parsedValue = e.newValue === null || e.newValue === 'null' ? null : JSON.parse(e.newValue);
|
|
305
|
-
this.updateState(parsedValue, true);
|
|
306
|
-
};
|
|
307
299
|
window.addEventListener('storage', this._listen);
|
|
308
300
|
// If a custom API endpoint is being used, the session may be being managed
|
|
309
301
|
// by HttpOnly cookies, which we can't detect.
|
|
@@ -318,7 +310,13 @@ class BaseSubscriptionService {
|
|
|
318
310
|
}
|
|
319
311
|
}
|
|
320
312
|
// Listening for state changes across tabs
|
|
321
|
-
_listen
|
|
313
|
+
_listen = (e)=>{
|
|
314
|
+
if (e.key !== getPersistentStorageKey(this._publicToken, '')) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const parsedValue = e.newValue === null || e.newValue === 'null' ? null : JSON.parse(e.newValue);
|
|
318
|
+
this.updateState(parsedValue, true);
|
|
319
|
+
};
|
|
322
320
|
getTokens() {
|
|
323
321
|
const { session_token, session_jwt } = this._datalayer.readSessionCookie();
|
|
324
322
|
if (!(typeof session_token === 'string') || !(typeof session_jwt === 'string')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionService.mjs","sources":["../../../../../../web/src/SubscriptionService.ts"],"sourcesContent":["import {\n B2BState,\n ConsumerState,\n Member,\n Organization,\n SessionTokens,\n SessionTokensUpdate,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n AuthenticateResponse,\n B2BAuthenticateResponse,\n B2BAuthenticateResponseWithMFA,\n B2BDiscoveryAuthenticateResponse,\n UnsubscribeFunction,\n User,\n} from '@stytch/core/public';\nimport {\n AllowedOpaqueTokens,\n ExtractOpaqueTokens,\n IB2BSubscriptionService,\n logger,\n IConsumerSubscriptionService,\n IfOpaqueTokens,\n ISubscriptionService,\n CommonAuthenticateOptions,\n OpaqueTokensNeverConfig,\n SessionUpdateOptions,\n InternalSessionUpdateOptions,\n} from '@stytch/core';\nimport Cookies from 'js-cookie';\nimport { createDeepEqual } from '@stytch/js-utils';\nimport { hasMultipleCookies, isLocalhost } from '../src/utils';\nimport {\n getKeyBoundStorage,\n getPersistentStorageKey,\n IKeyBoundStorage,\n safeLocalStorage,\n safeSessionStorage,\n StorageKey,\n} from './utils/storage';\n\ntype SubscriberFunction<T> = (value: T | null) => void;\ntype Subscribers<T> = Record<string, SubscriberFunction<T>>;\n\nconst STYTCH_SESSION_COOKIE = 'stytch_session';\nconst STYTCH_SESSION_JWT_COOKIE = 'stytch_session_jwt';\nconst STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE = 'stytch_intermediate_session_token';\nconst SEEN_DOMAINS_KEY = 'seen_domains';\n\nexport class SubscriptionDataLayer<T extends ConsumerState | B2BState> {\n publicToken: string;\n state: T | null;\n private readonly _opaqueTokenCookieName: string | null = null;\n private readonly _jwtCookieName: string | null = null;\n private readonly _cookiePath: string | null = null;\n private readonly _domain: string | null = null;\n private readonly _cookieAvailableToSubdomains: boolean = false;\n private readonly _istCookieName: string | null = null;\n\n subscriptions: Subscribers<T & SessionUpdateOptions>;\n\n private readonly _localStorage: IKeyBoundStorage;\n readonly browserSessionStorage: IKeyBoundStorage;\n\n constructor(publicToken: string, options?: StytchClientOptions) {\n this.publicToken = publicToken;\n this.state = null;\n this.subscriptions = {};\n\n // Initialize storage utilities\n this._localStorage = getKeyBoundStorage(safeLocalStorage, publicToken);\n this.browserSessionStorage = getKeyBoundStorage(safeSessionStorage, publicToken);\n\n if (options?.cookieOptions) {\n this._opaqueTokenCookieName = options.cookieOptions.opaqueTokenCookieName || null;\n this._jwtCookieName = options.cookieOptions.jwtCookieName || null;\n this._cookiePath = options.cookieOptions.path || null;\n this._domain = options.cookieOptions.domain || null;\n this._cookieAvailableToSubdomains = options.cookieOptions.availableToSubdomains || false;\n this._istCookieName = options.cookieOptions.istCookieName || null;\n }\n\n const localStorageState = this._localStorage.getItem('');\n\n if (!localStorageState) {\n return;\n }\n let parsedState: unknown;\n try {\n parsedState = JSON.parse(localStorageState);\n } catch {\n // Overwrite the bad data with nulls\n this.syncToLocalStorage();\n return;\n }\n // TODO: Validate the data looks decent & matches Session/User format\n this.state = parsedState as T;\n }\n\n protected get opaqueTokenCookieName(): string {\n return this._opaqueTokenCookieName ?? STYTCH_SESSION_COOKIE;\n }\n\n protected get jwtCookieName(): string {\n return this._jwtCookieName ?? STYTCH_SESSION_JWT_COOKIE;\n }\n\n protected get istCookieName(): string {\n return this._istCookieName ?? STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE;\n }\n\n readSessionCookie() {\n return {\n session_token: Cookies.get(this.opaqueTokenCookieName),\n session_jwt: Cookies.get(this.jwtCookieName),\n };\n }\n\n readIntermediateSessionTokenCookie() {\n return Cookies.get(this.istCookieName);\n }\n\n writeSessionCookie(stateDiff: StateWithReadableTokensLoggedIn<T>) {\n const { state, session_token, session_jwt } = stateDiff;\n\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: state?.session?.expires_at ?? '',\n availableToSubdomains: this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n if (cookieOpts.domain) {\n this.addSeenDomain(cookieOpts.domain);\n }\n\n Cookies.set(this.opaqueTokenCookieName, session_token, cookieOpts);\n Cookies.set(this.jwtCookieName, session_jwt, cookieOpts);\n\n /**\n * If a developer flips the boolean value of availableToSubdomains at any point,\n * there will be two cookies set which will could cause the user to log out since\n * the js-cookie API always returns the first cookie set. Thus, we will clear the\n * cookie that doesn't relate to the current cookie options.\n */\n\n const alternateCookieOptions = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: state?.session?.expires_at ?? '',\n availableToSubdomains: !this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n if (alternateCookieOptions.domain) {\n this.addSeenDomain(alternateCookieOptions.domain);\n }\n\n if (hasMultipleCookies(this.jwtCookieName)) {\n Cookies.remove(this.jwtCookieName, alternateCookieOptions);\n }\n\n if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n Cookies.remove(this.opaqueTokenCookieName, alternateCookieOptions);\n }\n\n if (hasMultipleCookies(this.jwtCookieName)) {\n logger.warn(\n 'Could not remove extraneous JWT cookie. This might happen if the cookie has been set using multiple `path` settings, and may produce unwanted behavior.',\n );\n }\n\n if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n logger.warn('Could not remove extraneous opaque token cookie.');\n }\n }\n\n writeIntermediateSessionTokenCookie(IST: string) {\n // ISTs are valid for 10 minutes\n const expiresAtTime = new Date(Date.now() + 10 * 60000);\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: expiresAtTime.toString(),\n availableToSubdomains: this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n Cookies.set(this.istCookieName, IST, cookieOpts);\n }\n\n removeSessionCookie() {\n this.removeCookies([this.opaqueTokenCookieName, this.jwtCookieName]);\n }\n\n removeISTCookie() {\n this.removeCookies([this.istCookieName]);\n }\n\n removeCookies(cookiesToRemove: string[]) {\n /**\n * Spray and Pray approach:\n * In order to delete a cookie, both the path and domain must match exactly\n * We don't always know how the cookie was set - we can use the path & info that the SDK was created with\n * but if the SDK settings have changed (e.g. a dev is developing) then things might get strange.\n * Note: it is _impossible_ to reliably delete a cookie if you don't know what path it was set at - thank,; internet\n * Our best effort approach is to just list off the likely combinations\n *\n * As of 2025-07-14, we track all domains that have been used to set cookies and try to delete\n * cookies from all of them to handle cases where domains change (e.g. something.com -> web.something.com)\n */\n\n // Get all previously seen domains\n const trackedDomains = this.getSeenDomains();\n // Include the current domain and null (no domain) in our attempts\n const allDomains = [this._domain, null, ...trackedDomains];\n // Remove duplicates\n const uniqueDomains = [...new Set(allDomains)];\n\n [true, false].forEach((availableToSubdomains) => {\n [this._cookiePath, null].forEach((path) => {\n uniqueDomains.forEach((domain) => {\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: new Date(0).toString(),\n availableToSubdomains,\n path,\n domain,\n });\n cookiesToRemove.forEach((cookieName) => {\n Cookies.remove(cookieName, cookieOpts);\n });\n });\n });\n });\n }\n\n syncToLocalStorage(): void {\n this._localStorage.setItem('', JSON.stringify(this.state));\n }\n\n getItem(key: StorageKey): string | null {\n return this._localStorage.getItem(key);\n }\n\n setItem(key: StorageKey, value: string): void {\n this._localStorage.setItem(key, value);\n }\n\n removeItem(key: StorageKey): void {\n this._localStorage.removeItem(key);\n }\n\n /**\n * Get all previously seen domains from local storage\n */\n private getSeenDomains(): string[] {\n const storedDomains = this.getItem(SEEN_DOMAINS_KEY);\n\n if (!storedDomains) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(storedDomains);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Add a domain to the seen domains list\n */\n private addSeenDomain(domain: string | null): void {\n if (!domain) {\n return;\n }\n\n const storedDomains = this.getSeenDomains();\n if (!storedDomains.includes(domain)) {\n storedDomains.push(domain);\n this.setItem(SEEN_DOMAINS_KEY, JSON.stringify(storedDomains));\n }\n }\n\n static generateCookieOpts({\n path,\n domain,\n availableToSubdomains,\n expiresAt,\n }: {\n path: string | null;\n domain: string | null;\n availableToSubdomains: boolean;\n expiresAt: string;\n }): Cookies.CookieAttributes {\n const cookieOpts: Cookies.CookieAttributes = {\n expires: new Date(expiresAt),\n sameSite: 'lax',\n };\n\n if (path) {\n cookieOpts.path = path;\n }\n\n if (isLocalhost()) {\n // We do not require HTTPS for localhost / local development\n // TODO: Could investigate disabling HTTPS for test projects\n cookieOpts.secure = false;\n } else {\n if (availableToSubdomains) {\n // Domain must be expressly configured in order for the cookie to\n // be sent to subdomains\n // UNLESS it is localhost, in which case domain should not be set\n // cf. https://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain\n cookieOpts.domain = domain || window.location.host;\n }\n cookieOpts.secure = true;\n }\n return cookieOpts;\n }\n}\n\nexport class ConsumerSubscriptionDataLayer extends SubscriptionDataLayer<ConsumerState> {}\nexport class B2BSubscriptionDataLayer extends SubscriptionDataLayer<B2BState> {}\n\n/**\n * We want multiple instances of the same Stytch SDK for the same project in the same page to\n * effectively share state - to do this, we create a single cache for the data layer.\n * In order to preserve the cache state across project hot module reloads, we bind it to\n * the global window object using a stytch-internal symbol.\n *\n * This also allows various StytchClients to communicate across package boundaries -\n * consider the following scenario:\n * - Next App splits out bundles per-page\n * - Next App uses Headless Client on all pages, and UI Client on one page\n * - UI client page includes its own copy of Headless Client (since UI depends on Headless CLient)\n * - B/C of code splitting & recombining, if someone navigates from a Headless page to a UI page\n * the there will actually be two copies of the HeadlessClient loaded,\n * one in the main bundle, and one included inside the UI Client code\n * - So using an in-memory global object will not suffice, we'll end up with two global objects in two diff packages\n */\ntype ConsumerDataLayerCache = Record<string, SubscriptionDataLayer<ConsumerState>>;\ntype B2BDataLayerCache = Record<string, SubscriptionDataLayer<B2BState>>;\n\nconst consumerDataLayerCacheSymbol = Symbol.for('__stytch_DataLayer');\nconst b2bDataLayerCacheSymbol = Symbol.for('__stytch_b2b_DataLayer');\n\nconst getConsumerDataLayerCache = (): ConsumerDataLayerCache => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdw = window as any;\n if (!wdw[consumerDataLayerCacheSymbol]) {\n wdw[consumerDataLayerCacheSymbol] = {};\n }\n return wdw[consumerDataLayerCacheSymbol];\n};\n\nconst getB2BDataLayerCache = (): B2BDataLayerCache => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdw = window as any;\n if (!wdw[b2bDataLayerCacheSymbol]) {\n wdw[b2bDataLayerCacheSymbol] = {};\n }\n return wdw[b2bDataLayerCacheSymbol];\n};\n\nexport const __clearConsumerDataLayerCache = () => {\n const dataLayerCache = getConsumerDataLayerCache();\n Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const __clearB2BDataLayerCache = () => {\n const dataLayerCache = getB2BDataLayerCache();\n Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const getConsumerDataLayer = (\n publicToken: string,\n options?: StytchClientOptions,\n): ConsumerSubscriptionDataLayer => {\n const dataLayerCache = getConsumerDataLayerCache();\n if (!dataLayerCache[publicToken]) {\n dataLayerCache[publicToken] = new ConsumerSubscriptionDataLayer(publicToken, options);\n }\n return dataLayerCache[publicToken];\n};\n\nexport const getB2BDataLayer = (publicToken: string, options?: StytchClientOptions): B2BSubscriptionDataLayer => {\n const dataLayerCache = getB2BDataLayerCache();\n if (!dataLayerCache[publicToken]) {\n dataLayerCache[publicToken] = new B2BSubscriptionDataLayer(publicToken, options);\n }\n return dataLayerCache[publicToken];\n};\n\nconst addSubscriber = <T>(collection: Subscribers<T>, subscriber: SubscriberFunction<T>): UnsubscribeFunction => {\n const uniqueId = Math.random().toString(36).slice(-10);\n collection[uniqueId] = subscriber;\n return () => delete collection[uniqueId];\n};\n\nconst notifySubscribers = <T>(collection: Subscribers<T>, value: T | null): void => {\n Object.values(collection).forEach((cb) => cb(value));\n};\n\ntype StateWithReadableTokensLoggedIn<T> = {\n state: T | null;\n intermediate_session_token: null;\n session_token: string;\n session_jwt: string;\n};\n\ntype StateIfOpaqueTokensLoggedIn<T> = {\n state: T | null;\n intermediate_session_token: null;\n session_token: true;\n session_jwt: true;\n};\n\ntype StateWithTokensLoggedIn<T> = StateWithReadableTokensLoggedIn<T> | StateIfOpaqueTokensLoggedIn<T>;\n\ntype StateWithTokensLoggedOut = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: null;\n};\n\ntype StateWithReadableIntermediateSessionToken = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: string;\n};\n\ntype StateWithOpaqueIntermediateSessionToken = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: true;\n};\n\ntype StateWithIntermediateSessionToken =\n | StateWithReadableIntermediateSessionToken\n | StateWithOpaqueIntermediateSessionToken;\n\ntype StateWithTokensDiff<T> = StateWithTokensLoggedIn<T> | StateWithTokensLoggedOut | StateWithIntermediateSessionToken;\n\nconst deepEqualData = createDeepEqual({\n KEYS_TO_EXCLUDE: ['last_accessed_at'],\n});\n\nexport class BaseSubscriptionService<T extends ConsumerState | B2BState, TOpaqueTokens extends AllowedOpaqueTokens>\n implements ISubscriptionService<T, TOpaqueTokens>\n{\n /**\n * Whether the state was retrieved from the cache and is awaiting a refresh\n */\n private fromCache = true;\n\n constructor(\n private _publicToken: string,\n private _datalayer: SubscriptionDataLayer<T>,\n { usingCustomApiEndpoint }: { usingCustomApiEndpoint: boolean },\n ) {\n window.addEventListener('storage', this._listen);\n\n // If a custom API endpoint is being used, the session may be being managed\n // by HttpOnly cookies, which we can't detect.\n if (!usingCustomApiEndpoint) {\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call\n const { session_token } = this._datalayer.readSessionCookie();\n if (!session_token) {\n this.destroySession();\n return;\n }\n }\n }\n\n // Listening for state changes across tabs\n private _listen = (e: StorageEvent) => {\n if (e.key !== getPersistentStorageKey(this._publicToken, '')) {\n return;\n }\n\n const parsedValue = e.newValue === null || e.newValue === 'null' ? null : (JSON.parse(e.newValue) as T);\n this.updateState(parsedValue, true);\n };\n\n getTokens(): IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null> {\n const { session_token, session_jwt } = this._datalayer.readSessionCookie();\n if (!(typeof session_token === 'string') || !(typeof session_jwt === 'string')) {\n return null as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n }\n return { session_token, session_jwt } as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n }\n\n getIntermediateSessionToken(): string | null {\n return this._datalayer.readIntermediateSessionTokenCookie() || null;\n }\n\n destroyState() {\n this.updateStateAndTokens({\n state: null,\n session_token: null,\n session_jwt: null,\n intermediate_session_token: null,\n });\n }\n\n destroySession() {\n this._datalayer.removeSessionCookie();\n this.updateState(null);\n }\n\n _updateStateAndTokensInternal(stateDiff: StateWithTokensDiff<T>, options: InternalSessionUpdateOptions) {\n const oldStateValue = this._datalayer.state;\n const newStateValue = stateDiff.state === null ? null : ({ ...this._datalayer.state, ...stateDiff.state } as T);\n this._datalayer.state = newStateValue;\n const wasCached = this.getFromCache();\n this.setCacheRefreshed();\n\n // NOTE: This means that our tab executes first before we signal the state change to other tabs\n // TODO: Should we avoid notifying subscribers in the same thread? Should we put\n // notifications in a setImmediate or setTimeout(..., 0)?\n // Should subscribers let us know if they are active/passive when they sign up?\n if (wasCached || !deepEqualData(oldStateValue, newStateValue)) {\n let notification: (T & SessionUpdateOptions) | null;\n if (newStateValue == null || options.fromCache) {\n notification = newStateValue;\n } else {\n notification = {\n ...newStateValue,\n sessionDurationMinutes: options.sessionDurationMinutes,\n };\n }\n\n notifySubscribers(this._datalayer.subscriptions, notification);\n }\n }\n\n updateStateAndTokens(\n stateDiff: StateWithTokensDiff<T>,\n options: InternalSessionUpdateOptions = { fromCache: false },\n ) {\n if (stateDiff.state) {\n if (typeof stateDiff.session_token === 'string') {\n this._datalayer.writeSessionCookie(stateDiff);\n } else {\n // The session token is opaque, so let's clear any residual session\n // cookies that may have been left over\n this._datalayer.removeSessionCookie();\n }\n this._datalayer.removeISTCookie();\n } else if (stateDiff.intermediate_session_token) {\n if (typeof stateDiff.intermediate_session_token === 'string') {\n this._datalayer.writeIntermediateSessionTokenCookie(stateDiff.intermediate_session_token);\n } else {\n // The intermediate session token is opaque, so let's clear any residual\n // intermediate session token cookies that may have been left over\n this._datalayer.removeISTCookie();\n }\n this._datalayer.removeSessionCookie();\n } else {\n this._datalayer.removeSessionCookie();\n this._datalayer.removeISTCookie();\n }\n\n this._updateStateAndTokensInternal(stateDiff, options);\n\n this._datalayer.syncToLocalStorage();\n }\n\n updateState(state: T | null, fromExternalSource = false) {\n const oldStateValue = this._datalayer.state;\n const newStateValue = state === null ? null : ({ ...this._datalayer.state, ...state } as T);\n this._datalayer.state = newStateValue;\n const wasCached = this.getFromCache();\n this.setCacheRefreshed();\n\n const hasStateChanged = !deepEqualData(oldStateValue, newStateValue);\n if (wasCached || hasStateChanged) {\n notifySubscribers(this._datalayer.subscriptions, newStateValue);\n\n // If there is no state change, or if this update was itself triggered by\n // a storage event, there is no need to sync to local storage since the\n // state is already in sync.\n if (hasStateChanged && !fromExternalSource) {\n // Delay notifying other tabs until after we have refreshed ourselves\n this._datalayer.syncToLocalStorage();\n }\n }\n }\n\n updateTokens(tokens: SessionTokensUpdate) {\n const { session_token, session_jwt } = tokens;\n const cookie = this._datalayer.readSessionCookie();\n const diff = {\n ...cookie,\n session_token,\n session_jwt,\n } as StateWithTokensDiff<T>;\n if (typeof session_token === 'string' || typeof session_jwt === 'string') {\n this._datalayer.writeSessionCookie(diff as StateWithReadableTokensLoggedIn<T>);\n this._datalayer.removeISTCookie();\n } else {\n this._datalayer.removeSessionCookie();\n }\n }\n\n subscribeToState(callback: SubscriberFunction<T & SessionUpdateOptions>): UnsubscribeFunction {\n return addSubscriber(this._datalayer.subscriptions, callback);\n }\n\n getState(): T | null {\n return this._datalayer.state;\n }\n\n destroy() {\n window.removeEventListener('storage', this._listen);\n }\n\n syncFromDeviceStorage() {\n return null;\n }\n\n getFromCache(): boolean {\n return this.fromCache;\n }\n\n setCacheRefreshed() {\n this.fromCache = false;\n }\n}\n\nexport class ConsumerSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseSubscriptionService<ConsumerState, ExtractOpaqueTokens<TProjectConfiguration>>\n implements IConsumerSubscriptionService<TProjectConfiguration>\n{\n updateUser = (user: User) => this.updateState({ user });\n getUser = () => this.getState()?.user ?? null;\n getSession = () => this.getState()?.session ?? null;\n updateSession: IConsumerSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n const { session, user, session_jwt, session_token } = resp;\n\n if (session_token && session_jwt) {\n this.updateStateAndTokens(\n {\n state: { session, user },\n session_jwt,\n session_token,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n } else {\n this.updateStateAndTokens(\n {\n state: { session, user },\n session_token: true,\n session_jwt: true,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n }\n };\n\n withUpdateSession =\n <\n Args extends [] | [options?: CommonAuthenticateOptions] | (string | CommonAuthenticateOptions)[],\n Ret extends AuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig> | null,\n >(\n authenticate: (...args: Args) => Promise<Ret>,\n ): ((...args: Args) => Promise<Ret>) =>\n async (...args) => {\n const resp = await authenticate(...args);\n if (resp != null) {\n const options = args.find((a): a is CommonAuthenticateOptions => a != null && !(typeof a === 'string'));\n this.updateSession(resp, {\n sessionDurationMinutes: options?.session_duration_minutes,\n });\n }\n return resp;\n };\n}\n\nexport class B2BSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseSubscriptionService<B2BState, ExtractOpaqueTokens<TProjectConfiguration>>\n implements IB2BSubscriptionService<TProjectConfiguration>\n{\n updateMember = (member: Member) => this.updateState({ member });\n getMember = () => this.getState()?.member ?? null;\n updateOrganization = (organization: Organization) => this.updateState({ organization });\n getOrganization = () => this.getState()?.organization ?? null;\n getSession = () => this.getState()?.session ?? null;\n updateSession: IB2BSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n if ('member_session' in resp && resp.member_session) {\n const tokens =\n resp.session_token && resp.session_jwt\n ? { session_token: resp.session_token, session_jwt: resp.session_jwt }\n : ({ session_token: true, session_jwt: true } as const);\n\n this.updateStateAndTokens(\n {\n state: {\n session: resp.member_session,\n member: resp.member,\n organization: resp.organization,\n },\n ...tokens,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n } else {\n this.updateStateAndTokens(\n {\n state: null,\n session_token: null,\n session_jwt: null,\n intermediate_session_token: resp.intermediate_session_token || true,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n }\n };\n\n withUpdateSession =\n <\n Options extends CommonAuthenticateOptions | undefined,\n Ret extends\n | B2BAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>\n | B2BAuthenticateResponseWithMFA<TProjectConfiguration & OpaqueTokensNeverConfig>\n | B2BDiscoveryAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>,\n >(\n authenticate: (options: Options) => Promise<Ret>,\n ): ((options: Options) => Promise<Ret>) =>\n async (options) => {\n const resp = await authenticate(options);\n this.updateSession(resp, {\n sessionDurationMinutes: options?.session_duration_minutes,\n });\n return resp;\n };\n}\n"],"names":["STYTCH_SESSION_COOKIE","STYTCH_SESSION_JWT_COOKIE","STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE","SEEN_DOMAINS_KEY","SubscriptionDataLayer","publicToken","state","_opaqueTokenCookieName","_jwtCookieName","_cookiePath","_domain","_cookieAvailableToSubdomains","_istCookieName","subscriptions","_localStorage","browserSessionStorage","constructor","options","getKeyBoundStorage","safeLocalStorage","safeSessionStorage","cookieOptions","opaqueTokenCookieName","jwtCookieName","path","domain","availableToSubdomains","istCookieName","localStorageState","getItem","parsedState","JSON","parse","syncToLocalStorage","readSessionCookie","session_token","Cookies","get","session_jwt","readIntermediateSessionTokenCookie","writeSessionCookie","stateDiff","cookieOpts","generateCookieOpts","expiresAt","session","expires_at","addSeenDomain","set","alternateCookieOptions","hasMultipleCookies","remove","logger","warn","writeIntermediateSessionTokenCookie","IST","expiresAtTime","Date","now","toString","removeSessionCookie","removeCookies","removeISTCookie","cookiesToRemove","trackedDomains","getSeenDomains","allDomains","uniqueDomains","Set","forEach","cookieName","setItem","stringify","key","value","removeItem","storedDomains","parsed","Array","isArray","includes","push","expires","sameSite","isLocalhost","secure","window","location","host","ConsumerSubscriptionDataLayer","B2BSubscriptionDataLayer","consumerDataLayerCacheSymbol","Symbol","for","b2bDataLayerCacheSymbol","getConsumerDataLayerCache","wdw","getB2BDataLayerCache","getConsumerDataLayer","dataLayerCache","getB2BDataLayer","addSubscriber","collection","subscriber","uniqueId","Math","random","slice","notifySubscribers","Object","values","cb","deepEqualData","createDeepEqual","KEYS_TO_EXCLUDE","BaseSubscriptionService","fromCache","_publicToken","_datalayer","usingCustomApiEndpoint","_listen","e","getPersistentStorageKey","parsedValue","newValue","updateState","addEventListener","destroySession","getTokens","getIntermediateSessionToken","destroyState","updateStateAndTokens","intermediate_session_token","_updateStateAndTokensInternal","oldStateValue","newStateValue","wasCached","getFromCache","setCacheRefreshed","notification","sessionDurationMinutes","fromExternalSource","hasStateChanged","updateTokens","tokens","cookie","diff","subscribeToState","callback","getState","destroy","removeEventListener","syncFromDeviceStorage","ConsumerSubscriptionService","updateUser","user","getUser","getSession","updateSession","resp","withUpdateSession","authenticate","args","find","a","session_duration_minutes","B2BSubscriptionService","updateMember","member","getMember","updateOrganization","organization","getOrganization","member_session"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SubscriptionService.mjs","sources":["../../../../../../web/src/SubscriptionService.ts"],"sourcesContent":["import {\n B2BState,\n ConsumerState,\n Member,\n Organization,\n SessionTokens,\n SessionTokensUpdate,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n AuthenticateResponse,\n B2BAuthenticateResponse,\n B2BAuthenticateResponseWithMFA,\n B2BDiscoveryAuthenticateResponse,\n UnsubscribeFunction,\n User,\n} from '@stytch/core/public';\nimport {\n AllowedOpaqueTokens,\n ExtractOpaqueTokens,\n IB2BSubscriptionService,\n logger,\n IConsumerSubscriptionService,\n IfOpaqueTokens,\n ISubscriptionService,\n CommonAuthenticateOptions,\n OpaqueTokensNeverConfig,\n SessionUpdateOptions,\n InternalSessionUpdateOptions,\n} from '@stytch/core';\nimport Cookies from 'js-cookie';\nimport { createDeepEqual } from '@stytch/js-utils';\nimport { hasMultipleCookies, isLocalhost } from '../src/utils';\nimport {\n getKeyBoundStorage,\n getPersistentStorageKey,\n IKeyBoundStorage,\n safeLocalStorage,\n safeSessionStorage,\n StorageKey,\n} from './utils/storage';\n\ntype SubscriberFunction<T> = (value: T | null) => void;\ntype Subscribers<T> = Record<string, SubscriberFunction<T>>;\n\nconst STYTCH_SESSION_COOKIE = 'stytch_session';\nconst STYTCH_SESSION_JWT_COOKIE = 'stytch_session_jwt';\nconst STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE = 'stytch_intermediate_session_token';\nconst SEEN_DOMAINS_KEY = 'seen_domains';\n\nexport class SubscriptionDataLayer<T extends ConsumerState | B2BState> {\n publicToken: string;\n state: T | null;\n private readonly _opaqueTokenCookieName: string | null = null;\n private readonly _jwtCookieName: string | null = null;\n private readonly _cookiePath: string | null = null;\n private readonly _domain: string | null = null;\n private readonly _cookieAvailableToSubdomains: boolean = false;\n private readonly _istCookieName: string | null = null;\n\n subscriptions: Subscribers<T & SessionUpdateOptions>;\n\n private readonly _localStorage: IKeyBoundStorage;\n readonly browserSessionStorage: IKeyBoundStorage;\n\n constructor(publicToken: string, options?: StytchClientOptions) {\n this.publicToken = publicToken;\n this.state = null;\n this.subscriptions = {};\n\n // Initialize storage utilities\n this._localStorage = getKeyBoundStorage(safeLocalStorage, publicToken);\n this.browserSessionStorage = getKeyBoundStorage(safeSessionStorage, publicToken);\n\n if (options?.cookieOptions) {\n this._opaqueTokenCookieName = options.cookieOptions.opaqueTokenCookieName || null;\n this._jwtCookieName = options.cookieOptions.jwtCookieName || null;\n this._cookiePath = options.cookieOptions.path || null;\n this._domain = options.cookieOptions.domain || null;\n this._cookieAvailableToSubdomains = options.cookieOptions.availableToSubdomains || false;\n this._istCookieName = options.cookieOptions.istCookieName || null;\n }\n\n const localStorageState = this._localStorage.getItem('');\n\n if (!localStorageState) {\n return;\n }\n let parsedState: unknown;\n try {\n parsedState = JSON.parse(localStorageState);\n } catch {\n // Overwrite the bad data with nulls\n this.syncToLocalStorage();\n return;\n }\n // TODO: Validate the data looks decent & matches Session/User format\n this.state = parsedState as T;\n }\n\n protected get opaqueTokenCookieName(): string {\n return this._opaqueTokenCookieName ?? STYTCH_SESSION_COOKIE;\n }\n\n protected get jwtCookieName(): string {\n return this._jwtCookieName ?? STYTCH_SESSION_JWT_COOKIE;\n }\n\n protected get istCookieName(): string {\n return this._istCookieName ?? STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE;\n }\n\n readSessionCookie() {\n return {\n session_token: Cookies.get(this.opaqueTokenCookieName),\n session_jwt: Cookies.get(this.jwtCookieName),\n };\n }\n\n readIntermediateSessionTokenCookie() {\n return Cookies.get(this.istCookieName);\n }\n\n writeSessionCookie(stateDiff: StateWithReadableTokensLoggedIn<T>) {\n const { state, session_token, session_jwt } = stateDiff;\n\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: state?.session?.expires_at ?? '',\n availableToSubdomains: this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n if (cookieOpts.domain) {\n this.addSeenDomain(cookieOpts.domain);\n }\n\n Cookies.set(this.opaqueTokenCookieName, session_token, cookieOpts);\n Cookies.set(this.jwtCookieName, session_jwt, cookieOpts);\n\n /**\n * If a developer flips the boolean value of availableToSubdomains at any point,\n * there will be two cookies set which will could cause the user to log out since\n * the js-cookie API always returns the first cookie set. Thus, we will clear the\n * cookie that doesn't relate to the current cookie options.\n */\n\n const alternateCookieOptions = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: state?.session?.expires_at ?? '',\n availableToSubdomains: !this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n if (alternateCookieOptions.domain) {\n this.addSeenDomain(alternateCookieOptions.domain);\n }\n\n if (hasMultipleCookies(this.jwtCookieName)) {\n Cookies.remove(this.jwtCookieName, alternateCookieOptions);\n }\n\n if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n Cookies.remove(this.opaqueTokenCookieName, alternateCookieOptions);\n }\n\n if (hasMultipleCookies(this.jwtCookieName)) {\n logger.warn(\n 'Could not remove extraneous JWT cookie. This might happen if the cookie has been set using multiple `path` settings, and may produce unwanted behavior.',\n );\n }\n\n if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n logger.warn('Could not remove extraneous opaque token cookie.');\n }\n }\n\n writeIntermediateSessionTokenCookie(IST: string) {\n // ISTs are valid for 10 minutes\n const expiresAtTime = new Date(Date.now() + 10 * 60000);\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: expiresAtTime.toString(),\n availableToSubdomains: this._cookieAvailableToSubdomains,\n path: this._cookiePath,\n domain: this._domain,\n });\n\n Cookies.set(this.istCookieName, IST, cookieOpts);\n }\n\n removeSessionCookie() {\n this.removeCookies([this.opaqueTokenCookieName, this.jwtCookieName]);\n }\n\n removeISTCookie() {\n this.removeCookies([this.istCookieName]);\n }\n\n removeCookies(cookiesToRemove: string[]) {\n /**\n * Spray and Pray approach:\n * In order to delete a cookie, both the path and domain must match exactly\n * We don't always know how the cookie was set - we can use the path & info that the SDK was created with\n * but if the SDK settings have changed (e.g. a dev is developing) then things might get strange.\n * Note: it is _impossible_ to reliably delete a cookie if you don't know what path it was set at - thank,; internet\n * Our best effort approach is to just list off the likely combinations\n *\n * As of 2025-07-14, we track all domains that have been used to set cookies and try to delete\n * cookies from all of them to handle cases where domains change (e.g. something.com -> web.something.com)\n */\n\n // Get all previously seen domains\n const trackedDomains = this.getSeenDomains();\n // Include the current domain and null (no domain) in our attempts\n const allDomains = [this._domain, null, ...trackedDomains];\n // Remove duplicates\n const uniqueDomains = [...new Set(allDomains)];\n\n [true, false].forEach((availableToSubdomains) => {\n [this._cookiePath, null].forEach((path) => {\n uniqueDomains.forEach((domain) => {\n const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n expiresAt: new Date(0).toString(),\n availableToSubdomains,\n path,\n domain,\n });\n cookiesToRemove.forEach((cookieName) => {\n Cookies.remove(cookieName, cookieOpts);\n });\n });\n });\n });\n }\n\n syncToLocalStorage(): void {\n this._localStorage.setItem('', JSON.stringify(this.state));\n }\n\n getItem(key: StorageKey): string | null {\n return this._localStorage.getItem(key);\n }\n\n setItem(key: StorageKey, value: string): void {\n this._localStorage.setItem(key, value);\n }\n\n removeItem(key: StorageKey): void {\n this._localStorage.removeItem(key);\n }\n\n /**\n * Get all previously seen domains from local storage\n */\n private getSeenDomains(): string[] {\n const storedDomains = this.getItem(SEEN_DOMAINS_KEY);\n\n if (!storedDomains) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(storedDomains);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Add a domain to the seen domains list\n */\n private addSeenDomain(domain: string | null): void {\n if (!domain) {\n return;\n }\n\n const storedDomains = this.getSeenDomains();\n if (!storedDomains.includes(domain)) {\n storedDomains.push(domain);\n this.setItem(SEEN_DOMAINS_KEY, JSON.stringify(storedDomains));\n }\n }\n\n static generateCookieOpts({\n path,\n domain,\n availableToSubdomains,\n expiresAt,\n }: {\n path: string | null;\n domain: string | null;\n availableToSubdomains: boolean;\n expiresAt: string;\n }): Cookies.CookieAttributes {\n const cookieOpts: Cookies.CookieAttributes = {\n expires: new Date(expiresAt),\n sameSite: 'lax',\n };\n\n if (path) {\n cookieOpts.path = path;\n }\n\n if (isLocalhost()) {\n // We do not require HTTPS for localhost / local development\n // TODO: Could investigate disabling HTTPS for test projects\n cookieOpts.secure = false;\n } else {\n if (availableToSubdomains) {\n // Domain must be expressly configured in order for the cookie to\n // be sent to subdomains\n // UNLESS it is localhost, in which case domain should not be set\n // cf. https://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain\n cookieOpts.domain = domain || window.location.host;\n }\n cookieOpts.secure = true;\n }\n return cookieOpts;\n }\n}\n\nexport class ConsumerSubscriptionDataLayer extends SubscriptionDataLayer<ConsumerState> {}\nexport class B2BSubscriptionDataLayer extends SubscriptionDataLayer<B2BState> {}\n\n/**\n * We want multiple instances of the same Stytch SDK for the same project in the same page to\n * effectively share state - to do this, we create a single cache for the data layer.\n * In order to preserve the cache state across project hot module reloads, we bind it to\n * the global window object using a stytch-internal symbol.\n *\n * This also allows various StytchClients to communicate across package boundaries -\n * consider the following scenario:\n * - Next App splits out bundles per-page\n * - Next App uses Headless Client on all pages, and UI Client on one page\n * - UI client page includes its own copy of Headless Client (since UI depends on Headless CLient)\n * - B/C of code splitting & recombining, if someone navigates from a Headless page to a UI page\n * the there will actually be two copies of the HeadlessClient loaded,\n * one in the main bundle, and one included inside the UI Client code\n * - So using an in-memory global object will not suffice, we'll end up with two global objects in two diff packages\n */\ntype ConsumerDataLayerCache = Record<string, SubscriptionDataLayer<ConsumerState>>;\ntype B2BDataLayerCache = Record<string, SubscriptionDataLayer<B2BState>>;\n\nconst consumerDataLayerCacheSymbol = Symbol.for('__stytch_DataLayer');\nconst b2bDataLayerCacheSymbol = Symbol.for('__stytch_b2b_DataLayer');\n\nconst getConsumerDataLayerCache = (): ConsumerDataLayerCache => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdw = window as any;\n if (!wdw[consumerDataLayerCacheSymbol]) {\n wdw[consumerDataLayerCacheSymbol] = {};\n }\n return wdw[consumerDataLayerCacheSymbol];\n};\n\nconst getB2BDataLayerCache = (): B2BDataLayerCache => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wdw = window as any;\n if (!wdw[b2bDataLayerCacheSymbol]) {\n wdw[b2bDataLayerCacheSymbol] = {};\n }\n return wdw[b2bDataLayerCacheSymbol];\n};\n\nexport const __clearConsumerDataLayerCache = () => {\n const dataLayerCache = getConsumerDataLayerCache();\n Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const __clearB2BDataLayerCache = () => {\n const dataLayerCache = getB2BDataLayerCache();\n Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const getConsumerDataLayer = (\n publicToken: string,\n options?: StytchClientOptions,\n): ConsumerSubscriptionDataLayer => {\n const dataLayerCache = getConsumerDataLayerCache();\n if (!dataLayerCache[publicToken]) {\n dataLayerCache[publicToken] = new ConsumerSubscriptionDataLayer(publicToken, options);\n }\n return dataLayerCache[publicToken];\n};\n\nexport const getB2BDataLayer = (publicToken: string, options?: StytchClientOptions): B2BSubscriptionDataLayer => {\n const dataLayerCache = getB2BDataLayerCache();\n if (!dataLayerCache[publicToken]) {\n dataLayerCache[publicToken] = new B2BSubscriptionDataLayer(publicToken, options);\n }\n return dataLayerCache[publicToken];\n};\n\nconst addSubscriber = <T>(collection: Subscribers<T>, subscriber: SubscriberFunction<T>): UnsubscribeFunction => {\n const uniqueId = Math.random().toString(36).slice(-10);\n collection[uniqueId] = subscriber;\n return () => delete collection[uniqueId];\n};\n\nconst notifySubscribers = <T>(collection: Subscribers<T>, value: T | null): void => {\n Object.values(collection).forEach((cb) => cb(value));\n};\n\ntype StateWithReadableTokensLoggedIn<T> = {\n state: T | null;\n intermediate_session_token: null;\n session_token: string;\n session_jwt: string;\n};\n\ntype StateIfOpaqueTokensLoggedIn<T> = {\n state: T | null;\n intermediate_session_token: null;\n session_token: true;\n session_jwt: true;\n};\n\ntype StateWithTokensLoggedIn<T> = StateWithReadableTokensLoggedIn<T> | StateIfOpaqueTokensLoggedIn<T>;\n\ntype StateWithTokensLoggedOut = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: null;\n};\n\ntype StateWithReadableIntermediateSessionToken = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: string;\n};\n\ntype StateWithOpaqueIntermediateSessionToken = {\n state: null;\n session_token: null;\n session_jwt: null;\n intermediate_session_token: true;\n};\n\ntype StateWithIntermediateSessionToken =\n | StateWithReadableIntermediateSessionToken\n | StateWithOpaqueIntermediateSessionToken;\n\ntype StateWithTokensDiff<T> = StateWithTokensLoggedIn<T> | StateWithTokensLoggedOut | StateWithIntermediateSessionToken;\n\nconst deepEqualData = createDeepEqual({\n KEYS_TO_EXCLUDE: ['last_accessed_at'],\n});\n\nexport class BaseSubscriptionService<T extends ConsumerState | B2BState, TOpaqueTokens extends AllowedOpaqueTokens>\n implements ISubscriptionService<T, TOpaqueTokens>\n{\n /**\n * Whether the state was retrieved from the cache and is awaiting a refresh\n */\n private fromCache = true;\n\n constructor(\n private _publicToken: string,\n private _datalayer: SubscriptionDataLayer<T>,\n { usingCustomApiEndpoint }: { usingCustomApiEndpoint: boolean },\n ) {\n window.addEventListener('storage', this._listen);\n\n // If a custom API endpoint is being used, the session may be being managed\n // by HttpOnly cookies, which we can't detect.\n if (!usingCustomApiEndpoint) {\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call\n const { session_token } = this._datalayer.readSessionCookie();\n if (!session_token) {\n this.destroySession();\n return;\n }\n }\n }\n\n // Listening for state changes across tabs\n private _listen = (e: StorageEvent) => {\n if (e.key !== getPersistentStorageKey(this._publicToken, '')) {\n return;\n }\n\n const parsedValue = e.newValue === null || e.newValue === 'null' ? null : (JSON.parse(e.newValue) as T);\n this.updateState(parsedValue, true);\n };\n\n getTokens(): IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null> {\n const { session_token, session_jwt } = this._datalayer.readSessionCookie();\n if (!(typeof session_token === 'string') || !(typeof session_jwt === 'string')) {\n return null as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n }\n return { session_token, session_jwt } as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n }\n\n getIntermediateSessionToken(): string | null {\n return this._datalayer.readIntermediateSessionTokenCookie() || null;\n }\n\n destroyState() {\n this.updateStateAndTokens({\n state: null,\n session_token: null,\n session_jwt: null,\n intermediate_session_token: null,\n });\n }\n\n destroySession() {\n this._datalayer.removeSessionCookie();\n this.updateState(null);\n }\n\n _updateStateAndTokensInternal(stateDiff: StateWithTokensDiff<T>, options: InternalSessionUpdateOptions) {\n const oldStateValue = this._datalayer.state;\n const newStateValue = stateDiff.state === null ? null : ({ ...this._datalayer.state, ...stateDiff.state } as T);\n this._datalayer.state = newStateValue;\n const wasCached = this.getFromCache();\n this.setCacheRefreshed();\n\n // NOTE: This means that our tab executes first before we signal the state change to other tabs\n // TODO: Should we avoid notifying subscribers in the same thread? Should we put\n // notifications in a setImmediate or setTimeout(..., 0)?\n // Should subscribers let us know if they are active/passive when they sign up?\n if (wasCached || !deepEqualData(oldStateValue, newStateValue)) {\n let notification: (T & SessionUpdateOptions) | null;\n if (newStateValue == null || options.fromCache) {\n notification = newStateValue;\n } else {\n notification = {\n ...newStateValue,\n sessionDurationMinutes: options.sessionDurationMinutes,\n };\n }\n\n notifySubscribers(this._datalayer.subscriptions, notification);\n }\n }\n\n updateStateAndTokens(\n stateDiff: StateWithTokensDiff<T>,\n options: InternalSessionUpdateOptions = { fromCache: false },\n ) {\n if (stateDiff.state) {\n if (typeof stateDiff.session_token === 'string') {\n this._datalayer.writeSessionCookie(stateDiff);\n } else {\n // The session token is opaque, so let's clear any residual session\n // cookies that may have been left over\n this._datalayer.removeSessionCookie();\n }\n this._datalayer.removeISTCookie();\n } else if (stateDiff.intermediate_session_token) {\n if (typeof stateDiff.intermediate_session_token === 'string') {\n this._datalayer.writeIntermediateSessionTokenCookie(stateDiff.intermediate_session_token);\n } else {\n // The intermediate session token is opaque, so let's clear any residual\n // intermediate session token cookies that may have been left over\n this._datalayer.removeISTCookie();\n }\n this._datalayer.removeSessionCookie();\n } else {\n this._datalayer.removeSessionCookie();\n this._datalayer.removeISTCookie();\n }\n\n this._updateStateAndTokensInternal(stateDiff, options);\n\n this._datalayer.syncToLocalStorage();\n }\n\n updateState(state: T | null, fromExternalSource = false) {\n const oldStateValue = this._datalayer.state;\n const newStateValue = state === null ? null : ({ ...this._datalayer.state, ...state } as T);\n this._datalayer.state = newStateValue;\n const wasCached = this.getFromCache();\n this.setCacheRefreshed();\n\n const hasStateChanged = !deepEqualData(oldStateValue, newStateValue);\n if (wasCached || hasStateChanged) {\n notifySubscribers(this._datalayer.subscriptions, newStateValue);\n\n // If there is no state change, or if this update was itself triggered by\n // a storage event, there is no need to sync to local storage since the\n // state is already in sync.\n if (hasStateChanged && !fromExternalSource) {\n // Delay notifying other tabs until after we have refreshed ourselves\n this._datalayer.syncToLocalStorage();\n }\n }\n }\n\n updateTokens(tokens: SessionTokensUpdate) {\n const { session_token, session_jwt } = tokens;\n const cookie = this._datalayer.readSessionCookie();\n const diff = {\n ...cookie,\n session_token,\n session_jwt,\n } as StateWithTokensDiff<T>;\n if (typeof session_token === 'string' || typeof session_jwt === 'string') {\n this._datalayer.writeSessionCookie(diff as StateWithReadableTokensLoggedIn<T>);\n this._datalayer.removeISTCookie();\n } else {\n this._datalayer.removeSessionCookie();\n }\n }\n\n subscribeToState(callback: SubscriberFunction<T & SessionUpdateOptions>): UnsubscribeFunction {\n return addSubscriber(this._datalayer.subscriptions, callback);\n }\n\n getState(): T | null {\n return this._datalayer.state;\n }\n\n destroy() {\n window.removeEventListener('storage', this._listen);\n }\n\n syncFromDeviceStorage() {\n return null;\n }\n\n getFromCache(): boolean {\n return this.fromCache;\n }\n\n setCacheRefreshed() {\n this.fromCache = false;\n }\n}\n\nexport class ConsumerSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseSubscriptionService<ConsumerState, ExtractOpaqueTokens<TProjectConfiguration>>\n implements IConsumerSubscriptionService<TProjectConfiguration>\n{\n updateUser = (user: User) => this.updateState({ user });\n getUser = () => this.getState()?.user ?? null;\n getSession = () => this.getState()?.session ?? null;\n updateSession: IConsumerSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n const { session, user, session_jwt, session_token } = resp;\n\n if (session_token && session_jwt) {\n this.updateStateAndTokens(\n {\n state: { session, user },\n session_jwt,\n session_token,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n } else {\n this.updateStateAndTokens(\n {\n state: { session, user },\n session_token: true,\n session_jwt: true,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n }\n };\n\n withUpdateSession =\n <\n Args extends [] | [options?: CommonAuthenticateOptions] | (string | CommonAuthenticateOptions)[],\n Ret extends AuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig> | null,\n >(\n authenticate: (...args: Args) => Promise<Ret>,\n ): ((...args: Args) => Promise<Ret>) =>\n async (...args) => {\n const resp = await authenticate(...args);\n if (resp != null) {\n const options = args.find((a): a is CommonAuthenticateOptions => a != null && !(typeof a === 'string'));\n this.updateSession(resp, {\n sessionDurationMinutes: options?.session_duration_minutes,\n });\n }\n return resp;\n };\n}\n\nexport class B2BSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseSubscriptionService<B2BState, ExtractOpaqueTokens<TProjectConfiguration>>\n implements IB2BSubscriptionService<TProjectConfiguration>\n{\n updateMember = (member: Member) => this.updateState({ member });\n getMember = () => this.getState()?.member ?? null;\n updateOrganization = (organization: Organization) => this.updateState({ organization });\n getOrganization = () => this.getState()?.organization ?? null;\n getSession = () => this.getState()?.session ?? null;\n updateSession: IB2BSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n if ('member_session' in resp && resp.member_session) {\n const tokens =\n resp.session_token && resp.session_jwt\n ? { session_token: resp.session_token, session_jwt: resp.session_jwt }\n : ({ session_token: true, session_jwt: true } as const);\n\n this.updateStateAndTokens(\n {\n state: {\n session: resp.member_session,\n member: resp.member,\n organization: resp.organization,\n },\n ...tokens,\n intermediate_session_token: null,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n } else {\n this.updateStateAndTokens(\n {\n state: null,\n session_token: null,\n session_jwt: null,\n intermediate_session_token: resp.intermediate_session_token || true,\n },\n {\n fromCache: false,\n sessionDurationMinutes: options?.sessionDurationMinutes,\n },\n );\n }\n };\n\n withUpdateSession =\n <\n Options extends CommonAuthenticateOptions | undefined,\n Ret extends\n | B2BAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>\n | B2BAuthenticateResponseWithMFA<TProjectConfiguration & OpaqueTokensNeverConfig>\n | B2BDiscoveryAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>,\n >(\n authenticate: (options: Options) => Promise<Ret>,\n ): ((options: Options) => Promise<Ret>) =>\n async (options) => {\n const resp = await authenticate(options);\n this.updateSession(resp, {\n sessionDurationMinutes: options?.session_duration_minutes,\n });\n return resp;\n };\n}\n"],"names":["STYTCH_SESSION_COOKIE","STYTCH_SESSION_JWT_COOKIE","STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE","SEEN_DOMAINS_KEY","SubscriptionDataLayer","publicToken","state","_opaqueTokenCookieName","_jwtCookieName","_cookiePath","_domain","_cookieAvailableToSubdomains","_istCookieName","subscriptions","_localStorage","browserSessionStorage","options","getKeyBoundStorage","safeLocalStorage","safeSessionStorage","cookieOptions","opaqueTokenCookieName","jwtCookieName","path","domain","availableToSubdomains","istCookieName","localStorageState","getItem","parsedState","JSON","parse","syncToLocalStorage","readSessionCookie","session_token","Cookies","get","session_jwt","readIntermediateSessionTokenCookie","writeSessionCookie","stateDiff","cookieOpts","generateCookieOpts","expiresAt","session","expires_at","addSeenDomain","set","alternateCookieOptions","hasMultipleCookies","remove","logger","warn","writeIntermediateSessionTokenCookie","IST","expiresAtTime","Date","now","toString","removeSessionCookie","removeCookies","removeISTCookie","cookiesToRemove","trackedDomains","getSeenDomains","allDomains","uniqueDomains","Set","forEach","cookieName","setItem","stringify","key","value","removeItem","storedDomains","parsed","Array","isArray","includes","push","expires","sameSite","isLocalhost","secure","window","location","host","ConsumerSubscriptionDataLayer","B2BSubscriptionDataLayer","consumerDataLayerCacheSymbol","Symbol","for","b2bDataLayerCacheSymbol","getConsumerDataLayerCache","wdw","getB2BDataLayerCache","getConsumerDataLayer","dataLayerCache","getB2BDataLayer","addSubscriber","collection","subscriber","uniqueId","Math","random","slice","notifySubscribers","Object","values","cb","deepEqualData","createDeepEqual","KEYS_TO_EXCLUDE","BaseSubscriptionService","fromCache","_publicToken","_datalayer","usingCustomApiEndpoint","addEventListener","_listen","destroySession","e","getPersistentStorageKey","parsedValue","newValue","updateState","getTokens","getIntermediateSessionToken","destroyState","updateStateAndTokens","intermediate_session_token","_updateStateAndTokensInternal","oldStateValue","newStateValue","wasCached","getFromCache","setCacheRefreshed","notification","sessionDurationMinutes","fromExternalSource","hasStateChanged","updateTokens","tokens","cookie","diff","subscribeToState","callback","getState","destroy","removeEventListener","syncFromDeviceStorage","ConsumerSubscriptionService","updateUser","user","getUser","getSession","updateSession","resp","withUpdateSession","authenticate","args","find","a","session_duration_minutes","B2BSubscriptionService","updateMember","member","getMember","updateOrganization","organization","getOrganization","member_session"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import merge from '../../../../../_virtual/
|
|
1
|
+
import merge from '../../../../../_virtual/index4.mjs';
|
|
2
2
|
import 'react';
|
|
3
3
|
import createTheme from '../../../../../node_modules/@mui/material/styles/createTheme.mjs';
|
|
4
4
|
import selectClasses from '../../../../../node_modules/@mui/material/Select/selectClasses.mjs';
|
|
@@ -11,55 +11,55 @@ import { StytchSDKUsageError } from '../../../core/src/public/SDKErrors.mjs';
|
|
|
11
11
|
class HeadlessB2BOAuthClient extends HeadlessB2BOAuthClient$1 {
|
|
12
12
|
_oneTap;
|
|
13
13
|
constructor(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth = DisabledDFPProtectedAuthProvider(), _oneTap){
|
|
14
|
-
super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth), this._oneTap = _oneTap
|
|
15
|
-
const clientResult = await this._oneTap.createOneTapClient();
|
|
16
|
-
if (!clientResult.success) {
|
|
17
|
-
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
18
|
-
}
|
|
19
|
-
const { client } = clientResult;
|
|
20
|
-
const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({
|
|
21
|
-
discoveryRedirectUrl: options.discovery_redirect_url,
|
|
22
|
-
onSuccess: this._oneTap.redirectOnSuccess
|
|
23
|
-
});
|
|
24
|
-
return client.render({
|
|
25
|
-
style: {
|
|
26
|
-
position: OneTapPositions.floating
|
|
27
|
-
},
|
|
28
|
-
callback: onSuccessCallback,
|
|
29
|
-
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
30
|
-
});
|
|
31
|
-
}, this.startOneTap = async (options)=>{
|
|
32
|
-
if (!options.organization_id) {
|
|
33
|
-
throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');
|
|
34
|
-
}
|
|
35
|
-
const clientResult = await this._oneTap.createOneTapClient();
|
|
36
|
-
if (!clientResult.success) {
|
|
37
|
-
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
38
|
-
}
|
|
39
|
-
const { client } = clientResult;
|
|
40
|
-
const onSuccessCallback = this._oneTap.createOnSuccessHandler({
|
|
41
|
-
organizationId: options.organization_id,
|
|
42
|
-
signupRedirectUrl: options.signup_redirect_url,
|
|
43
|
-
loginRedirectUrl: options.login_redirect_url,
|
|
44
|
-
onSuccess: this._oneTap.redirectOnSuccess
|
|
45
|
-
});
|
|
46
|
-
return client.render({
|
|
47
|
-
style: {
|
|
48
|
-
position: OneTapPositions.floating
|
|
49
|
-
},
|
|
50
|
-
callback: onSuccessCallback,
|
|
51
|
-
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
52
|
-
});
|
|
53
|
-
}, this.googleOneTap = {
|
|
54
|
-
discovery: {
|
|
55
|
-
start: this.startOneTapDiscovery
|
|
56
|
-
},
|
|
57
|
-
start: this.startOneTap
|
|
58
|
-
};
|
|
14
|
+
super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth), this._oneTap = _oneTap;
|
|
59
15
|
}
|
|
60
|
-
startOneTapDiscovery
|
|
61
|
-
|
|
62
|
-
|
|
16
|
+
startOneTapDiscovery = async (options)=>{
|
|
17
|
+
const clientResult = await this._oneTap.createOneTapClient();
|
|
18
|
+
if (!clientResult.success) {
|
|
19
|
+
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
20
|
+
}
|
|
21
|
+
const { client } = clientResult;
|
|
22
|
+
const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({
|
|
23
|
+
discoveryRedirectUrl: options.discovery_redirect_url,
|
|
24
|
+
onSuccess: this._oneTap.redirectOnSuccess
|
|
25
|
+
});
|
|
26
|
+
return client.render({
|
|
27
|
+
style: {
|
|
28
|
+
position: OneTapPositions.floating
|
|
29
|
+
},
|
|
30
|
+
callback: onSuccessCallback,
|
|
31
|
+
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
startOneTap = async (options)=>{
|
|
35
|
+
if (!options.organization_id) {
|
|
36
|
+
throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');
|
|
37
|
+
}
|
|
38
|
+
const clientResult = await this._oneTap.createOneTapClient();
|
|
39
|
+
if (!clientResult.success) {
|
|
40
|
+
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
41
|
+
}
|
|
42
|
+
const { client } = clientResult;
|
|
43
|
+
const onSuccessCallback = this._oneTap.createOnSuccessHandler({
|
|
44
|
+
organizationId: options.organization_id,
|
|
45
|
+
signupRedirectUrl: options.signup_redirect_url,
|
|
46
|
+
loginRedirectUrl: options.login_redirect_url,
|
|
47
|
+
onSuccess: this._oneTap.redirectOnSuccess
|
|
48
|
+
});
|
|
49
|
+
return client.render({
|
|
50
|
+
style: {
|
|
51
|
+
position: OneTapPositions.floating
|
|
52
|
+
},
|
|
53
|
+
callback: onSuccessCallback,
|
|
54
|
+
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
googleOneTap = {
|
|
58
|
+
discovery: {
|
|
59
|
+
start: this.startOneTapDiscovery
|
|
60
|
+
},
|
|
61
|
+
start: this.startOneTap
|
|
62
|
+
};
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
export { HeadlessB2BOAuthClient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessB2BOAuthClient.mjs","sources":["../../../../../../../web/src/b2b/HeadlessB2BOAuthClient.ts"],"sourcesContent":["import { OneTapRenderResult } from '../oneTap/GoogleOneTapClient';\nimport {\n IHeadlessB2BOAuthClient,\n OneTapPositions,\n StytchProjectConfigurationInput,\n StytchSDKUsageError,\n} from '@stytch/core/public';\nimport {\n HeadlessB2BOAuthClient as BaseHeadlessB2BOAuthClient,\n DisabledDFPProtectedAuthProvider,\n IDFPProtectedAuthProvider,\n INetworkClient,\n IPKCEManager,\n IB2BSubscriptionService,\n} from '@stytch/core';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\n\nexport type B2BGoogleOneTapDiscoveryOAuthOptions = {\n /**\n * The URL that Stytch redirects to after the Google One Tap discovery flow is completed.\n * This should be a URL that verifies the request by querying Stytch's /oauth/discovery/authenticate endpoint.\n * If this value is not passed, the default discovery redirect URL that you set in your Dashboard is used.\n * If you have not set a default discovery redirect URL, an error is returned.\n */\n discovery_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\nexport type B2BGoogleOneTapOAuthOptions = {\n /**\n * The ID of the organization that the end user is logging in to.\n */\n organization_id: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who already exists.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default login redirect URL that you set in your Dashboard is used.\n * If you have not set a default login redirect URL, an error is returned.\n */\n login_redirect_url?: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who does not yet exist.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default signup redirect URL that you set in your Dashboard is used.\n * If you have not set a default signup redirect URL, an error is returned.\n */\n signup_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\ninterface IB2BGoogleOneTapOAuthProvider {\n discovery: {\n /**\n * Start a discovery OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.discovery.start({\n * discovery_redirect_url: 'https://example.com/oauth/callback',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapDiscoveryOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult>;\n };\n /**\n * Start an OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.start({\n * organization_id: 'organization-test-123',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult>;\n}\n\ntype DynamicConfig = Promise<{\n cnameDomain: null | string;\n pkceRequiredForOAuth: boolean;\n}>;\ntype Config = {\n publicToken: string;\n testAPIURL: string;\n liveAPIURL: string;\n};\n\nexport interface IWebB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends IHeadlessB2BOAuthClient<TProjectConfiguration> {\n googleOneTap: IB2BGoogleOneTapOAuthProvider;\n}\n\nexport class HeadlessB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseHeadlessB2BOAuthClient<TProjectConfiguration>\n implements IWebB2BOAuthClient<TProjectConfiguration>\n{\n constructor(\n _networkClient: INetworkClient,\n _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n _pkceManager: IPKCEManager,\n _dynamicConfig: DynamicConfig,\n _config: Config,\n _dfpProtectedAuth: IDFPProtectedAuthProvider = DisabledDFPProtectedAuthProvider(),\n private _oneTap: B2BOneTapProvider,\n ) {\n super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth);\n }\n\n private startOneTapDiscovery = async (options: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult> => {\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({\n discoveryRedirectUrl: options.discovery_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n private startOneTap = async (options: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult> => {\n if (!options.organization_id) {\n throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');\n }\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnSuccessHandler({\n organizationId: options.organization_id,\n signupRedirectUrl: options.signup_redirect_url,\n loginRedirectUrl: options.login_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n googleOneTap: IB2BGoogleOneTapOAuthProvider = {\n discovery: {\n start: this.startOneTapDiscovery,\n },\n start: this.startOneTap,\n };\n}\n"],"names":["HeadlessB2BOAuthClient","BaseHeadlessB2BOAuthClient","constructor","_networkClient","_subscriptionService","_pkceManager","_dynamicConfig","_config","_dfpProtectedAuth","DisabledDFPProtectedAuthProvider","_oneTap","startOneTapDiscovery","options","clientResult","createOneTapClient","success","Error","reason","client","onSuccessCallback","createOnDiscoverySuccessHandler","discoveryRedirectUrl","discovery_redirect_url","onSuccess","redirectOnSuccess","render","style","position","OneTapPositions","floating","callback","cancelOnTapOutside","cancel_on_tap_outside","startOneTap","organization_id","StytchSDKUsageError","createOnSuccessHandler","organizationId","signupRedirectUrl","signup_redirect_url","loginRedirectUrl","login_redirect_url","googleOneTap","discovery","start"],"mappings":";;;;;;;;;;AA0HO,MAAMA,sBAAAA,SACHC,wBAAAA,CAAAA;;AAGRC,IAAAA,WAAAA,CACEC,cAA8B,EAC9BC,oBAAoE,EACpEC,YAA0B,EAC1BC,cAA6B,EAC7BC,OAAe,EACfC,iBAAAA,GAA+CC,gCAAAA,EAAkC,EACzEC,OAA0B,CAClC;QACA,KAAK,CAACP,cAAAA,EAAgBC,oBAAAA,EAAsBC,YAAAA,EAAcC,cAAAA,EAAgBC,SAASC,iBAAAA,CAAAA,EAAAA,IAAAA,CAF3EE,OAAAA,GAAAA,OAAAA,EAAAA,IAAAA,CAKFC,oBAAAA,GAAuB,OAAOC,OAAAA,GAAAA;AACpC,YAAA,MAAMC,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;YAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,YAAA;YAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,YAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAACU,+BAA+B,CAAC;AACrEC,gBAAAA,oBAAAA,EAAsBT,QAAQU,sBAAsB;AACpDC,gBAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,aAAA,CAAA;YAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;gBACnBC,KAAAA,EAAO;AACLC,oBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,iBAAA;gBACAC,QAAAA,EAAUX,iBAAAA;AACVY,gBAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,aAAA,CAAA;AACF,QAAA,CAAA,EAAA,IAAA,CAEQC,cAAc,OAAOrB,OAAAA,GAAAA;YAC3B,IAAI,CAACA,OAAAA,CAAQsB,eAAe,EAAE;gBAC5B,MAAM,IAAIC,oBAAoB,iCAAA,EAAmC,wCAAA,CAAA;AACnE,YAAA;AACA,YAAA,MAAMtB,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;YAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,YAAA;YAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,YAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAAC0B,sBAAsB,CAAC;AAC5DC,gBAAAA,cAAAA,EAAgBzB,QAAQsB,eAAe;AACvCI,gBAAAA,iBAAAA,EAAmB1B,QAAQ2B,mBAAmB;AAC9CC,gBAAAA,gBAAAA,EAAkB5B,QAAQ6B,kBAAkB;AAC5ClB,gBAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,aAAA,CAAA;YAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;gBACnBC,KAAAA,EAAO;AACLC,oBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,iBAAA;gBACAC,QAAAA,EAAUX,iBAAAA;AACVY,gBAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,aAAA,CAAA;AACF,QAAA,CAAA,EAAA,IAAA,CAEAU,YAAAA,GAA8C;YAC5CC,SAAAA,EAAW;gBACTC,KAAAA,EAAO,IAAI,CAACjC;AACd,aAAA;YACAiC,KAAAA,EAAO,IAAI,CAACX;AACd,SAAA;AAxDA,IAAA;IAEQtB,oBAAAA;IAsBAsB,WAAAA;IA2BRS,YAAAA;AAMF;;;;"}
|
|
1
|
+
{"version":3,"file":"HeadlessB2BOAuthClient.mjs","sources":["../../../../../../../web/src/b2b/HeadlessB2BOAuthClient.ts"],"sourcesContent":["import { OneTapRenderResult } from '../oneTap/GoogleOneTapClient';\nimport {\n IHeadlessB2BOAuthClient,\n OneTapPositions,\n StytchProjectConfigurationInput,\n StytchSDKUsageError,\n} from '@stytch/core/public';\nimport {\n HeadlessB2BOAuthClient as BaseHeadlessB2BOAuthClient,\n DisabledDFPProtectedAuthProvider,\n IDFPProtectedAuthProvider,\n INetworkClient,\n IPKCEManager,\n IB2BSubscriptionService,\n} from '@stytch/core';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\n\nexport type B2BGoogleOneTapDiscoveryOAuthOptions = {\n /**\n * The URL that Stytch redirects to after the Google One Tap discovery flow is completed.\n * This should be a URL that verifies the request by querying Stytch's /oauth/discovery/authenticate endpoint.\n * If this value is not passed, the default discovery redirect URL that you set in your Dashboard is used.\n * If you have not set a default discovery redirect URL, an error is returned.\n */\n discovery_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\nexport type B2BGoogleOneTapOAuthOptions = {\n /**\n * The ID of the organization that the end user is logging in to.\n */\n organization_id: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who already exists.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default login redirect URL that you set in your Dashboard is used.\n * If you have not set a default login redirect URL, an error is returned.\n */\n login_redirect_url?: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who does not yet exist.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default signup redirect URL that you set in your Dashboard is used.\n * If you have not set a default signup redirect URL, an error is returned.\n */\n signup_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\ninterface IB2BGoogleOneTapOAuthProvider {\n discovery: {\n /**\n * Start a discovery OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.discovery.start({\n * discovery_redirect_url: 'https://example.com/oauth/callback',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapDiscoveryOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult>;\n };\n /**\n * Start an OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.start({\n * organization_id: 'organization-test-123',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult>;\n}\n\ntype DynamicConfig = Promise<{\n cnameDomain: null | string;\n pkceRequiredForOAuth: boolean;\n}>;\ntype Config = {\n publicToken: string;\n testAPIURL: string;\n liveAPIURL: string;\n};\n\nexport interface IWebB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends IHeadlessB2BOAuthClient<TProjectConfiguration> {\n googleOneTap: IB2BGoogleOneTapOAuthProvider;\n}\n\nexport class HeadlessB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseHeadlessB2BOAuthClient<TProjectConfiguration>\n implements IWebB2BOAuthClient<TProjectConfiguration>\n{\n constructor(\n _networkClient: INetworkClient,\n _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n _pkceManager: IPKCEManager,\n _dynamicConfig: DynamicConfig,\n _config: Config,\n _dfpProtectedAuth: IDFPProtectedAuthProvider = DisabledDFPProtectedAuthProvider(),\n private _oneTap: B2BOneTapProvider,\n ) {\n super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth);\n }\n\n private startOneTapDiscovery = async (options: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult> => {\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({\n discoveryRedirectUrl: options.discovery_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n private startOneTap = async (options: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult> => {\n if (!options.organization_id) {\n throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');\n }\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnSuccessHandler({\n organizationId: options.organization_id,\n signupRedirectUrl: options.signup_redirect_url,\n loginRedirectUrl: options.login_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n googleOneTap: IB2BGoogleOneTapOAuthProvider = {\n discovery: {\n start: this.startOneTapDiscovery,\n },\n start: this.startOneTap,\n };\n}\n"],"names":["HeadlessB2BOAuthClient","BaseHeadlessB2BOAuthClient","_networkClient","_subscriptionService","_pkceManager","_dynamicConfig","_config","_dfpProtectedAuth","DisabledDFPProtectedAuthProvider","_oneTap","startOneTapDiscovery","options","clientResult","createOneTapClient","success","Error","reason","client","onSuccessCallback","createOnDiscoverySuccessHandler","discoveryRedirectUrl","discovery_redirect_url","onSuccess","redirectOnSuccess","render","style","position","OneTapPositions","floating","callback","cancelOnTapOutside","cancel_on_tap_outside","startOneTap","organization_id","StytchSDKUsageError","createOnSuccessHandler","organizationId","signupRedirectUrl","signup_redirect_url","loginRedirectUrl","login_redirect_url","googleOneTap","discovery","start"],"mappings":";;;;;;;;;;AA0HO,MAAMA,sBAAAA,SACHC,wBAAAA,CAAAA;;AAGR,IAAA,WAAA,CACEC,cAA8B,EAC9BC,oBAAoE,EACpEC,YAA0B,EAC1BC,cAA6B,EAC7BC,OAAe,EACfC,iBAAAA,GAA+CC,gCAAAA,EAAkC,EACzEC,OAA0B,CAClC;AACA,QAAA,KAAK,CAACP,cAAAA,EAAgBC,oBAAAA,EAAsBC,cAAcC,cAAAA,EAAgBC,OAAAA,EAASC,yBAF3EE,OAAAA,GAAAA,OAAAA;AAGV,IAAA;AAEQC,IAAAA,oBAAAA,GAAuB,OAAOC,OAAAA,GAAAA;AACpC,QAAA,MAAMC,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;QAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,QAAA;QAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,QAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAACU,+BAA+B,CAAC;AACrEC,YAAAA,oBAAAA,EAAsBT,QAAQU,sBAAsB;AACpDC,YAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,SAAA,CAAA;QAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;YACnBC,KAAAA,EAAO;AACLC,gBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,aAAA;YACAC,QAAAA,EAAUX,iBAAAA;AACVY,YAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,SAAA,CAAA;IACF,CAAA;AAEQC,IAAAA,WAAAA,GAAc,OAAOrB,OAAAA,GAAAA;QAC3B,IAAI,CAACA,OAAAA,CAAQsB,eAAe,EAAE;YAC5B,MAAM,IAAIC,oBAAoB,iCAAA,EAAmC,wCAAA,CAAA;AACnE,QAAA;AACA,QAAA,MAAMtB,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;QAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,QAAA;QAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,QAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAAC0B,sBAAsB,CAAC;AAC5DC,YAAAA,cAAAA,EAAgBzB,QAAQsB,eAAe;AACvCI,YAAAA,iBAAAA,EAAmB1B,QAAQ2B,mBAAmB;AAC9CC,YAAAA,gBAAAA,EAAkB5B,QAAQ6B,kBAAkB;AAC5ClB,YAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,SAAA,CAAA;QAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;YACnBC,KAAAA,EAAO;AACLC,gBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,aAAA;YACAC,QAAAA,EAAUX,iBAAAA;AACVY,YAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,SAAA,CAAA;IACF,CAAA;IAEAU,YAAAA,GAA8C;QAC5CC,SAAAA,EAAW;YACTC,KAAAA,EAAO,IAAI,CAACjC;AACd,SAAA;QACAiC,KAAAA,EAAO,IAAI,CAACX;KACd;AACF;;;;"}
|