@payez/next-mvp 3.0.0
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/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +112 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +94 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +383 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +69 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +79 -0
- package/dist/config/vibe-log-transport.js +203 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +351 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +166 -0
- package/dist/lib/session-store.js +537 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +52 -0
- package/dist/lib/token-lifecycle.js +398 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +140 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +408 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +72 -0
- package/dist/routes/auth/session.js +180 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +201 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1531 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +23 -0
- package/dist/vibe/index.js +67 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* useViabilitySession - Redis-backed session state hook
|
|
4
|
+
*
|
|
5
|
+
* This hook provides the REAL session state by consulting Redis via /api/session/viability
|
|
6
|
+
* instead of relying on the potentially stale NextAuth JWT cookie.
|
|
7
|
+
*
|
|
8
|
+
* Redis is the single source of truth. This hook:
|
|
9
|
+
* 1. Polls /api/session/viability to get actual session state from Redis
|
|
10
|
+
* 2. Returns consistent auth state across all components
|
|
11
|
+
* 3. Triggers callback when session state changes unexpectedly
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const { isAuthenticated, isLoading } = useViabilitySession();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
'use client';
|
|
19
|
+
/**
|
|
20
|
+
* useViabilitySession - Redis-backed session state hook
|
|
21
|
+
*
|
|
22
|
+
* This hook provides the REAL session state by consulting Redis via /api/session/viability
|
|
23
|
+
* instead of relying on the potentially stale NextAuth JWT cookie.
|
|
24
|
+
*
|
|
25
|
+
* Redis is the single source of truth. This hook:
|
|
26
|
+
* 1. Polls /api/session/viability to get actual session state from Redis
|
|
27
|
+
* 2. Returns consistent auth state across all components
|
|
28
|
+
* 3. Triggers callback when session state changes unexpectedly
|
|
29
|
+
*
|
|
30
|
+
* Usage:
|
|
31
|
+
* ```tsx
|
|
32
|
+
* const { isAuthenticated, isLoading } = useViabilitySession();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.useViabilitySession = useViabilitySession;
|
|
37
|
+
exports.useIsAuthenticated = useIsAuthenticated;
|
|
38
|
+
const react_1 = require("react");
|
|
39
|
+
const react_2 = require("next-auth/react");
|
|
40
|
+
function getGlobalState() {
|
|
41
|
+
if (typeof window === 'undefined') {
|
|
42
|
+
// SSR - return default state
|
|
43
|
+
return {
|
|
44
|
+
isAuthenticated: false,
|
|
45
|
+
isLoading: true,
|
|
46
|
+
requires2FA: false,
|
|
47
|
+
twoFactorComplete: false,
|
|
48
|
+
accessTokenExpired: false,
|
|
49
|
+
hasRefreshToken: false,
|
|
50
|
+
error: null,
|
|
51
|
+
lastChecked: null,
|
|
52
|
+
checkInProgress: false,
|
|
53
|
+
prevAuth: null,
|
|
54
|
+
intervalId: null,
|
|
55
|
+
listeners: new Set(),
|
|
56
|
+
onSessionInvalidCallbacks: new Set()
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Initialize global state on window if not present
|
|
60
|
+
if (!window.__viabilitySessionState) {
|
|
61
|
+
window.__viabilitySessionState = {
|
|
62
|
+
isAuthenticated: false,
|
|
63
|
+
isLoading: true,
|
|
64
|
+
requires2FA: false,
|
|
65
|
+
twoFactorComplete: false,
|
|
66
|
+
accessTokenExpired: false,
|
|
67
|
+
hasRefreshToken: false,
|
|
68
|
+
error: null,
|
|
69
|
+
lastChecked: null,
|
|
70
|
+
checkInProgress: false,
|
|
71
|
+
prevAuth: null,
|
|
72
|
+
intervalId: null,
|
|
73
|
+
listeners: new Set(),
|
|
74
|
+
onSessionInvalidCallbacks: new Set()
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return window.__viabilitySessionState;
|
|
78
|
+
}
|
|
79
|
+
async function doViabilityCheck() {
|
|
80
|
+
const state = getGlobalState();
|
|
81
|
+
// Prevent concurrent checks
|
|
82
|
+
if (state.checkInProgress)
|
|
83
|
+
return;
|
|
84
|
+
state.checkInProgress = true;
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch('/api/session/viability', {
|
|
87
|
+
method: 'GET',
|
|
88
|
+
headers: {
|
|
89
|
+
'Accept': 'application/json',
|
|
90
|
+
'Cache-Control': 'no-store'
|
|
91
|
+
},
|
|
92
|
+
credentials: 'include'
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
state.isLoading = false;
|
|
96
|
+
state.error = `Viability check failed: ${response.status}`;
|
|
97
|
+
state.lastChecked = Date.now();
|
|
98
|
+
notifyListeners();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const data = await response.json();
|
|
102
|
+
// Detect auth state change
|
|
103
|
+
if (state.prevAuth !== null && state.prevAuth !== data.authenticated) {
|
|
104
|
+
console.log('[useViabilitySession] Auth state changed:', {
|
|
105
|
+
was: state.prevAuth,
|
|
106
|
+
now: data.authenticated
|
|
107
|
+
});
|
|
108
|
+
if (!data.authenticated) {
|
|
109
|
+
// Notify all callbacks
|
|
110
|
+
state.onSessionInvalidCallbacks.forEach(cb => {
|
|
111
|
+
try {
|
|
112
|
+
cb();
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error('[useViabilitySession] onSessionInvalid error:', e);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
state.prevAuth = data.authenticated;
|
|
121
|
+
state.isAuthenticated = data.authenticated;
|
|
122
|
+
state.isLoading = false;
|
|
123
|
+
state.requires2FA = data.requires2FA ?? false;
|
|
124
|
+
state.twoFactorComplete = data.twoFactorComplete ?? false;
|
|
125
|
+
state.accessTokenExpired = data.accessTokenExpired ?? false;
|
|
126
|
+
state.hasRefreshToken = data.hasRefreshToken ?? false;
|
|
127
|
+
state.error = null;
|
|
128
|
+
state.lastChecked = Date.now();
|
|
129
|
+
notifyListeners();
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('[useViabilitySession] Error checking viability:', error);
|
|
133
|
+
const state = getGlobalState();
|
|
134
|
+
state.isLoading = false;
|
|
135
|
+
state.error = error instanceof Error ? error.message : 'Unknown error';
|
|
136
|
+
state.lastChecked = Date.now();
|
|
137
|
+
notifyListeners();
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
getGlobalState().checkInProgress = false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function notifyListeners() {
|
|
144
|
+
const state = getGlobalState();
|
|
145
|
+
state.listeners.forEach(listener => {
|
|
146
|
+
try {
|
|
147
|
+
listener();
|
|
148
|
+
}
|
|
149
|
+
catch (e) { /* ignore */ }
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function startPolling(interval) {
|
|
153
|
+
const state = getGlobalState();
|
|
154
|
+
if (state.intervalId !== null)
|
|
155
|
+
return; // Already polling
|
|
156
|
+
state.intervalId = setInterval(() => {
|
|
157
|
+
doViabilityCheck();
|
|
158
|
+
}, interval);
|
|
159
|
+
}
|
|
160
|
+
function stopPolling() {
|
|
161
|
+
const state = getGlobalState();
|
|
162
|
+
if (state.intervalId !== null) {
|
|
163
|
+
clearInterval(state.intervalId);
|
|
164
|
+
state.intervalId = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Hook that provides Redis-backed session state
|
|
169
|
+
*/
|
|
170
|
+
function useViabilitySession(options = {}) {
|
|
171
|
+
const { pollInterval = 30000, enablePolling = true, onSessionInvalid } = options;
|
|
172
|
+
const { status: nextAuthStatus } = (0, react_2.useSession)();
|
|
173
|
+
const [, forceUpdate] = (0, react_1.useState)(0);
|
|
174
|
+
const mountedRef = (0, react_1.useRef)(true);
|
|
175
|
+
const initializedRef = (0, react_1.useRef)(false);
|
|
176
|
+
// Register this component's onSessionInvalid callback
|
|
177
|
+
(0, react_1.useEffect)(() => {
|
|
178
|
+
if (onSessionInvalid) {
|
|
179
|
+
const state = getGlobalState();
|
|
180
|
+
state.onSessionInvalidCallbacks.add(onSessionInvalid);
|
|
181
|
+
return () => {
|
|
182
|
+
state.onSessionInvalidCallbacks.delete(onSessionInvalid);
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}, [onSessionInvalid]);
|
|
186
|
+
// Subscribe to global state changes
|
|
187
|
+
(0, react_1.useEffect)(() => {
|
|
188
|
+
mountedRef.current = true;
|
|
189
|
+
const listener = () => {
|
|
190
|
+
if (mountedRef.current) {
|
|
191
|
+
forceUpdate(n => n + 1);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const state = getGlobalState();
|
|
195
|
+
state.listeners.add(listener);
|
|
196
|
+
return () => {
|
|
197
|
+
mountedRef.current = false;
|
|
198
|
+
state.listeners.delete(listener);
|
|
199
|
+
};
|
|
200
|
+
}, []);
|
|
201
|
+
// Initial check when NextAuth status is determined - only once!
|
|
202
|
+
(0, react_1.useEffect)(() => {
|
|
203
|
+
if (nextAuthStatus === 'loading') {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const state = getGlobalState();
|
|
207
|
+
// Only do initial check once globally
|
|
208
|
+
if (!initializedRef.current && state.lastChecked === null) {
|
|
209
|
+
initializedRef.current = true;
|
|
210
|
+
doViabilityCheck();
|
|
211
|
+
}
|
|
212
|
+
}, [nextAuthStatus]);
|
|
213
|
+
// Manage polling - only one interval for all hook instances
|
|
214
|
+
(0, react_1.useEffect)(() => {
|
|
215
|
+
if (!enablePolling || nextAuthStatus === 'loading') {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// Start polling if not already started
|
|
219
|
+
startPolling(pollInterval);
|
|
220
|
+
// Cleanup: only stop if this is the last listener
|
|
221
|
+
return () => {
|
|
222
|
+
const state = getGlobalState();
|
|
223
|
+
// Small delay to allow other components to register
|
|
224
|
+
setTimeout(() => {
|
|
225
|
+
if (state.listeners.size === 0) {
|
|
226
|
+
stopPolling();
|
|
227
|
+
}
|
|
228
|
+
}, 100);
|
|
229
|
+
};
|
|
230
|
+
}, [enablePolling, pollInterval, nextAuthStatus]);
|
|
231
|
+
// Check viability on focus (user returns to tab) - with debounce
|
|
232
|
+
(0, react_1.useEffect)(() => {
|
|
233
|
+
const handleFocus = () => {
|
|
234
|
+
const state = getGlobalState();
|
|
235
|
+
// Debounce: only check if last check was > 10 seconds ago
|
|
236
|
+
if (state.lastChecked !== null &&
|
|
237
|
+
Date.now() - state.lastChecked > 10000) {
|
|
238
|
+
doViabilityCheck();
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
window.addEventListener('focus', handleFocus);
|
|
242
|
+
return () => window.removeEventListener('focus', handleFocus);
|
|
243
|
+
}, []);
|
|
244
|
+
// Return current state
|
|
245
|
+
const state = getGlobalState();
|
|
246
|
+
return {
|
|
247
|
+
isAuthenticated: state.isAuthenticated,
|
|
248
|
+
isLoading: state.isLoading,
|
|
249
|
+
requires2FA: state.requires2FA,
|
|
250
|
+
twoFactorComplete: state.twoFactorComplete,
|
|
251
|
+
accessTokenExpired: state.accessTokenExpired,
|
|
252
|
+
hasRefreshToken: state.hasRefreshToken,
|
|
253
|
+
error: state.error,
|
|
254
|
+
lastChecked: state.lastChecked,
|
|
255
|
+
refresh: doViabilityCheck
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Simplified hook that just returns authentication status
|
|
260
|
+
* Use this in components that only need to know if user is logged in
|
|
261
|
+
*/
|
|
262
|
+
function useIsAuthenticated() {
|
|
263
|
+
const { isAuthenticated, isLoading } = useViabilitySession({
|
|
264
|
+
pollInterval: 60000, // Less frequent polling for simple status
|
|
265
|
+
enablePolling: true
|
|
266
|
+
});
|
|
267
|
+
return { isAuthenticated, isLoading };
|
|
268
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { fetchWithAuth } from './client/fetch-with-auth';
|
|
2
|
+
export { useAnonSession } from './client/useAnonSession';
|
|
3
|
+
export type { AnonPreferences, AnonMetrics, AnonSession, UseAnonSessionReturn } from './client/useAnonSession';
|
|
4
|
+
export { AuthProvider, useAuthConfig, useAuthMode, useFederatedProviders, useFederatedAuthEnabled, useTraditionalAuthEnabled } from './client/AuthContext';
|
|
5
|
+
export type { AuthConfig } from './types/auth';
|
|
6
|
+
export { makeAuthDecision } from './auth/auth-decision';
|
|
7
|
+
export { isUnauthenticatedRoute, configurePublicRoutes, getRouteConfig } from './auth/route-config';
|
|
8
|
+
export { createMvpMiddleware } from './middleware/create-middleware';
|
|
9
|
+
export { UserAvatarMenu } from './components/account';
|
|
10
|
+
export type { UserAvatarMenuProps } from './components/account';
|
|
11
|
+
export { ErrorMetricsCard, HealthMetricsCard, AuditLogViewer, AdminAnalyticsLayout, useErrorMetrics, useHealthMetrics, useAuditLog, useAdminAnalytics, getErrorMetrics, getHealthMetrics, writeAuditLog, queryAuditLog, } from './logging';
|
|
12
|
+
export type { ErrorMetrics, HealthMetrics, AuditLogEntry, AuditLogQuery, AuditLogResponse, TimeRange, RouteError, LevelCount, CategoryCount, ErrorDetail, EndpointHealth, SlowRequest, } from './logging';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Type augmentation for NextAuth - included via ambient module declaration
|
|
3
|
+
// Note: Type declarations are picked up automatically via tsconfig.json, no explicit import needed
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.queryAuditLog = exports.writeAuditLog = exports.getHealthMetrics = exports.getErrorMetrics = exports.useAdminAnalytics = exports.useAuditLog = exports.useHealthMetrics = exports.useErrorMetrics = exports.AdminAnalyticsLayout = exports.AuditLogViewer = exports.HealthMetricsCard = exports.ErrorMetricsCard = exports.UserAvatarMenu = exports.createMvpMiddleware = exports.getRouteConfig = exports.configurePublicRoutes = exports.isUnauthenticatedRoute = exports.makeAuthDecision = exports.useTraditionalAuthEnabled = exports.useFederatedAuthEnabled = exports.useFederatedProviders = exports.useAuthMode = exports.useAuthConfig = exports.AuthProvider = exports.useAnonSession = exports.fetchWithAuth = void 0;
|
|
6
|
+
// NOTE: Server-only exports are NOT exported from the root to prevent bundling Node.js modules in client code.
|
|
7
|
+
// Server-side code should import from subpath exports:
|
|
8
|
+
// - Session management: import { sessionStore } from '@payez/next-mvp/lib/session-store'
|
|
9
|
+
// - Redis client: import { redis } from '@payez/next-mvp/lib/redis'
|
|
10
|
+
// - Token expiry: import { computeTokenExpiries } from '@payez/next-mvp/lib/token-expiry'
|
|
11
|
+
// - Refresh validation: import { validateRefreshToken } from '@payez/next-mvp/lib/refresh-token-validator'
|
|
12
|
+
// - Auth options: import { authOptions } from '@payez/next-mvp/auth/auth-options'
|
|
13
|
+
// - Auth handler: import { createAuthHandler } from '@payez/next-mvp/api/auth-handler'
|
|
14
|
+
// Client-safe exports only
|
|
15
|
+
// Client-side utilities
|
|
16
|
+
var fetch_with_auth_1 = require("./client/fetch-with-auth");
|
|
17
|
+
Object.defineProperty(exports, "fetchWithAuth", { enumerable: true, get: function () { return fetch_with_auth_1.fetchWithAuth; } });
|
|
18
|
+
// Anonymous session hook (for pre-login preferences like theme)
|
|
19
|
+
var useAnonSession_1 = require("./client/useAnonSession");
|
|
20
|
+
Object.defineProperty(exports, "useAnonSession", { enumerable: true, get: function () { return useAnonSession_1.useAnonSession; } });
|
|
21
|
+
// Authentication Context and Hooks
|
|
22
|
+
var AuthContext_1 = require("./client/AuthContext");
|
|
23
|
+
Object.defineProperty(exports, "AuthProvider", { enumerable: true, get: function () { return AuthContext_1.AuthProvider; } });
|
|
24
|
+
Object.defineProperty(exports, "useAuthConfig", { enumerable: true, get: function () { return AuthContext_1.useAuthConfig; } });
|
|
25
|
+
Object.defineProperty(exports, "useAuthMode", { enumerable: true, get: function () { return AuthContext_1.useAuthMode; } });
|
|
26
|
+
Object.defineProperty(exports, "useFederatedProviders", { enumerable: true, get: function () { return AuthContext_1.useFederatedProviders; } });
|
|
27
|
+
Object.defineProperty(exports, "useFederatedAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useFederatedAuthEnabled; } });
|
|
28
|
+
Object.defineProperty(exports, "useTraditionalAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useTraditionalAuthEnabled; } });
|
|
29
|
+
// Route configuration (client-safe)
|
|
30
|
+
var auth_decision_1 = require("./auth/auth-decision");
|
|
31
|
+
Object.defineProperty(exports, "makeAuthDecision", { enumerable: true, get: function () { return auth_decision_1.makeAuthDecision; } });
|
|
32
|
+
var route_config_1 = require("./auth/route-config");
|
|
33
|
+
Object.defineProperty(exports, "isUnauthenticatedRoute", { enumerable: true, get: function () { return route_config_1.isUnauthenticatedRoute; } });
|
|
34
|
+
Object.defineProperty(exports, "configurePublicRoutes", { enumerable: true, get: function () { return route_config_1.configurePublicRoutes; } });
|
|
35
|
+
Object.defineProperty(exports, "getRouteConfig", { enumerable: true, get: function () { return route_config_1.getRouteConfig; } });
|
|
36
|
+
var create_middleware_1 = require("./middleware/create-middleware");
|
|
37
|
+
Object.defineProperty(exports, "createMvpMiddleware", { enumerable: true, get: function () { return create_middleware_1.createMvpMiddleware; } });
|
|
38
|
+
// Account Components
|
|
39
|
+
var account_1 = require("./components/account");
|
|
40
|
+
Object.defineProperty(exports, "UserAvatarMenu", { enumerable: true, get: function () { return account_1.UserAvatarMenu; } });
|
|
41
|
+
// Admin Logging & Analytics (client-side components and hooks)
|
|
42
|
+
var logging_1 = require("./logging");
|
|
43
|
+
Object.defineProperty(exports, "ErrorMetricsCard", { enumerable: true, get: function () { return logging_1.ErrorMetricsCard; } });
|
|
44
|
+
Object.defineProperty(exports, "HealthMetricsCard", { enumerable: true, get: function () { return logging_1.HealthMetricsCard; } });
|
|
45
|
+
Object.defineProperty(exports, "AuditLogViewer", { enumerable: true, get: function () { return logging_1.AuditLogViewer; } });
|
|
46
|
+
Object.defineProperty(exports, "AdminAnalyticsLayout", { enumerable: true, get: function () { return logging_1.AdminAnalyticsLayout; } });
|
|
47
|
+
Object.defineProperty(exports, "useErrorMetrics", { enumerable: true, get: function () { return logging_1.useErrorMetrics; } });
|
|
48
|
+
Object.defineProperty(exports, "useHealthMetrics", { enumerable: true, get: function () { return logging_1.useHealthMetrics; } });
|
|
49
|
+
Object.defineProperty(exports, "useAuditLog", { enumerable: true, get: function () { return logging_1.useAuditLog; } });
|
|
50
|
+
Object.defineProperty(exports, "useAdminAnalytics", { enumerable: true, get: function () { return logging_1.useAdminAnalytics; } });
|
|
51
|
+
Object.defineProperty(exports, "getErrorMetrics", { enumerable: true, get: function () { return logging_1.getErrorMetrics; } });
|
|
52
|
+
Object.defineProperty(exports, "getHealthMetrics", { enumerable: true, get: function () { return logging_1.getHealthMetrics; } });
|
|
53
|
+
Object.defineProperty(exports, "writeAuditLog", { enumerable: true, get: function () { return logging_1.writeAuditLog; } });
|
|
54
|
+
Object.defineProperty(exports, "queryAuditLog", { enumerable: true, get: function () { return logging_1.queryAuditLog; } });
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous Session Store for `@payez/next-mvp`
|
|
3
|
+
*
|
|
4
|
+
* Provides Redis-backed anonymous sessions for tracking user preferences
|
|
5
|
+
* before they log in. When a user logs in, their anonymous session can be
|
|
6
|
+
* merged into their authenticated session.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Generates a unique visitor ID on first visit
|
|
10
|
+
* - Stores preferences (theme, locale, etc.) in Redis
|
|
11
|
+
* - Tracks usage metrics (resume count for free tier, etc.)
|
|
12
|
+
* - Provides merge functionality when user authenticates
|
|
13
|
+
*/
|
|
14
|
+
export declare const ANON_COOKIE_NAME: string;
|
|
15
|
+
export interface AnonSessionPreferences {
|
|
16
|
+
theme?: string;
|
|
17
|
+
locale?: string;
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
}
|
|
20
|
+
export interface AnonSessionMetrics {
|
|
21
|
+
resumeGenerationCount?: number;
|
|
22
|
+
firstVisit?: number;
|
|
23
|
+
lastVisit?: number;
|
|
24
|
+
visitCount?: number;
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}
|
|
27
|
+
export interface AnonSessionData {
|
|
28
|
+
id: string;
|
|
29
|
+
createdAt: number;
|
|
30
|
+
updatedAt: number;
|
|
31
|
+
preferences: AnonSessionPreferences;
|
|
32
|
+
metrics: AnonSessionMetrics;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generates a new anonymous session ID
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateAnonId(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new anonymous session in Redis
|
|
40
|
+
*/
|
|
41
|
+
export declare function createAnonSession(anonId?: string): Promise<AnonSessionData>;
|
|
42
|
+
/**
|
|
43
|
+
* Retrieves an anonymous session from Redis
|
|
44
|
+
*/
|
|
45
|
+
export declare function getAnonSession(anonId: string): Promise<AnonSessionData | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Gets or creates an anonymous session
|
|
48
|
+
*/
|
|
49
|
+
export declare function getOrCreateAnonSession(anonId?: string): Promise<AnonSessionData>;
|
|
50
|
+
/**
|
|
51
|
+
* Saves an anonymous session to Redis
|
|
52
|
+
*/
|
|
53
|
+
export declare function saveAnonSession(session: AnonSessionData): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Updates preferences in an anonymous session
|
|
56
|
+
*/
|
|
57
|
+
export declare function updateAnonPreferences(anonId: string, preferences: Partial<AnonSessionPreferences>): Promise<AnonSessionData | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Updates metrics in an anonymous session
|
|
60
|
+
*/
|
|
61
|
+
export declare function updateAnonMetrics(anonId: string, metrics: Partial<AnonSessionMetrics>): Promise<AnonSessionData | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Increments a numeric metric
|
|
64
|
+
*/
|
|
65
|
+
export declare function incrementAnonMetric(anonId: string, metricName: string, amount?: number): Promise<number>;
|
|
66
|
+
/**
|
|
67
|
+
* Deletes an anonymous session
|
|
68
|
+
*/
|
|
69
|
+
export declare function deleteAnonSession(anonId: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Merges anonymous session data into user profile data
|
|
72
|
+
* Call this when a user logs in to preserve their pre-login preferences
|
|
73
|
+
*/
|
|
74
|
+
export declare function mergeAnonSessionToUser(anonId: string, userId: string, mergeCallback?: (anonData: AnonSessionData, userId: string) => Promise<void>): Promise<AnonSessionData | null>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Anonymous Session Store for `@payez/next-mvp`
|
|
4
|
+
*
|
|
5
|
+
* Provides Redis-backed anonymous sessions for tracking user preferences
|
|
6
|
+
* before they log in. When a user logs in, their anonymous session can be
|
|
7
|
+
* merged into their authenticated session.
|
|
8
|
+
*
|
|
9
|
+
* Key features:
|
|
10
|
+
* - Generates a unique visitor ID on first visit
|
|
11
|
+
* - Stores preferences (theme, locale, etc.) in Redis
|
|
12
|
+
* - Tracks usage metrics (resume count for free tier, etc.)
|
|
13
|
+
* - Provides merge functionality when user authenticates
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.ANON_COOKIE_NAME = void 0;
|
|
20
|
+
exports.generateAnonId = generateAnonId;
|
|
21
|
+
exports.createAnonSession = createAnonSession;
|
|
22
|
+
exports.getAnonSession = getAnonSession;
|
|
23
|
+
exports.getOrCreateAnonSession = getOrCreateAnonSession;
|
|
24
|
+
exports.saveAnonSession = saveAnonSession;
|
|
25
|
+
exports.updateAnonPreferences = updateAnonPreferences;
|
|
26
|
+
exports.updateAnonMetrics = updateAnonMetrics;
|
|
27
|
+
exports.incrementAnonMetric = incrementAnonMetric;
|
|
28
|
+
exports.deleteAnonSession = deleteAnonSession;
|
|
29
|
+
exports.mergeAnonSessionToUser = mergeAnonSessionToUser;
|
|
30
|
+
const redis_1 = __importDefault(require("./redis"));
|
|
31
|
+
const crypto_1 = require("crypto");
|
|
32
|
+
const app_slug_1 = require("./app-slug");
|
|
33
|
+
// Use app-slug prefixes for multi-app isolation
|
|
34
|
+
const getAnonKey = (id) => `${(0, app_slug_1.getAnonPrefix)()}${id}`;
|
|
35
|
+
const ANON_SESSION_TTL = 90 * 24 * 60 * 60; // 90 days in seconds
|
|
36
|
+
// Export dynamic cookie name getter for external use
|
|
37
|
+
exports.ANON_COOKIE_NAME = (0, app_slug_1.getAnonCookieName)();
|
|
38
|
+
/**
|
|
39
|
+
* Generates a new anonymous session ID
|
|
40
|
+
*/
|
|
41
|
+
function generateAnonId() {
|
|
42
|
+
return (0, crypto_1.randomBytes)(16).toString('hex');
|
|
43
|
+
}
|
|
44
|
+
// getAnonKey is defined above using app-slug prefix
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new anonymous session in Redis
|
|
47
|
+
*/
|
|
48
|
+
async function createAnonSession(anonId) {
|
|
49
|
+
const id = anonId || generateAnonId();
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const session = {
|
|
52
|
+
id,
|
|
53
|
+
createdAt: now,
|
|
54
|
+
updatedAt: now,
|
|
55
|
+
preferences: {},
|
|
56
|
+
metrics: {
|
|
57
|
+
firstVisit: now,
|
|
58
|
+
lastVisit: now,
|
|
59
|
+
visitCount: 1,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const key = getAnonKey(id);
|
|
63
|
+
await redis_1.default.setex(key, ANON_SESSION_TTL, JSON.stringify(session));
|
|
64
|
+
return session;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Retrieves an anonymous session from Redis
|
|
68
|
+
*/
|
|
69
|
+
async function getAnonSession(anonId) {
|
|
70
|
+
if (!anonId)
|
|
71
|
+
return null;
|
|
72
|
+
const key = getAnonKey(anonId);
|
|
73
|
+
const json = await redis_1.default.get(key);
|
|
74
|
+
if (!json)
|
|
75
|
+
return null;
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(json);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Gets or creates an anonymous session
|
|
85
|
+
*/
|
|
86
|
+
async function getOrCreateAnonSession(anonId) {
|
|
87
|
+
if (anonId) {
|
|
88
|
+
const existing = await getAnonSession(anonId);
|
|
89
|
+
if (existing) {
|
|
90
|
+
// Update last visit
|
|
91
|
+
existing.updatedAt = Date.now();
|
|
92
|
+
existing.metrics.lastVisit = Date.now();
|
|
93
|
+
existing.metrics.visitCount = (existing.metrics.visitCount || 0) + 1;
|
|
94
|
+
await saveAnonSession(existing);
|
|
95
|
+
return existing;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Create new session
|
|
99
|
+
return createAnonSession(anonId);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Saves an anonymous session to Redis
|
|
103
|
+
*/
|
|
104
|
+
async function saveAnonSession(session) {
|
|
105
|
+
session.updatedAt = Date.now();
|
|
106
|
+
const key = getAnonKey(session.id);
|
|
107
|
+
await redis_1.default.setex(key, ANON_SESSION_TTL, JSON.stringify(session));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Updates preferences in an anonymous session
|
|
111
|
+
*/
|
|
112
|
+
async function updateAnonPreferences(anonId, preferences) {
|
|
113
|
+
const session = await getAnonSession(anonId);
|
|
114
|
+
if (!session)
|
|
115
|
+
return null;
|
|
116
|
+
session.preferences = { ...session.preferences, ...preferences };
|
|
117
|
+
await saveAnonSession(session);
|
|
118
|
+
return session;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Updates metrics in an anonymous session
|
|
122
|
+
*/
|
|
123
|
+
async function updateAnonMetrics(anonId, metrics) {
|
|
124
|
+
const session = await getAnonSession(anonId);
|
|
125
|
+
if (!session)
|
|
126
|
+
return null;
|
|
127
|
+
session.metrics = { ...session.metrics, ...metrics };
|
|
128
|
+
await saveAnonSession(session);
|
|
129
|
+
return session;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Increments a numeric metric
|
|
133
|
+
*/
|
|
134
|
+
async function incrementAnonMetric(anonId, metricName, amount = 1) {
|
|
135
|
+
const session = await getAnonSession(anonId);
|
|
136
|
+
if (!session)
|
|
137
|
+
return 0;
|
|
138
|
+
const currentValue = session.metrics[metricName] || 0;
|
|
139
|
+
const newValue = currentValue + amount;
|
|
140
|
+
session.metrics[metricName] = newValue;
|
|
141
|
+
await saveAnonSession(session);
|
|
142
|
+
return newValue;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Deletes an anonymous session
|
|
146
|
+
*/
|
|
147
|
+
async function deleteAnonSession(anonId) {
|
|
148
|
+
if (!anonId)
|
|
149
|
+
return;
|
|
150
|
+
const key = getAnonKey(anonId);
|
|
151
|
+
await redis_1.default.del(key);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Merges anonymous session data into user profile data
|
|
155
|
+
* Call this when a user logs in to preserve their pre-login preferences
|
|
156
|
+
*/
|
|
157
|
+
async function mergeAnonSessionToUser(anonId, userId, mergeCallback) {
|
|
158
|
+
const anonSession = await getAnonSession(anonId);
|
|
159
|
+
if (!anonSession)
|
|
160
|
+
return null;
|
|
161
|
+
// If a merge callback is provided, use it to persist data to user profile
|
|
162
|
+
if (mergeCallback) {
|
|
163
|
+
await mergeCallback(anonSession, userId);
|
|
164
|
+
}
|
|
165
|
+
// Optionally delete the anonymous session after merge
|
|
166
|
+
// await deleteAnonSession(anonId);
|
|
167
|
+
return anonSession;
|
|
168
|
+
}
|
|
169
|
+
// ANON_COOKIE_NAME is already exported at the top of the file
|